在Java 8中更新流内部的变量

时间:2017-04-03 08:54:16

标签: java java-8 java-stream

我正在玩Java 8。 现在我试图理解流。 到目前为止,我还没有看到关于循环遍历地图或列表然后填充不属于地图或列表的变量的示例。

以下是一个例子:

class RandomObject {
    private int i1;
    private String s1;
    //setter
    //getter
}

// Java 7
RandomObject randomObj = new RandomObject();
Map<Integer, String> mappy = new HashMap<Integer, String>();
Map<Integer, String> collect = new HashMap<Integer, String>();

mappy.put(1, "good map");
mappy.put(2, "nice map");
mappy.put(3, "wow");
mappy.put(4, "mappy the best map");

for (Map.Entry<Integer, String> entry : mappy.entrySet()) {
    if (entry.getKey() == 2) {
        randomObj.seti1(entry.getKey());
        randomObj.sets1(entry.getValue());
        collect.put(entry.getKey(), entry.getValue());
    }
}

// Java 8
RandomObject randomObj = new RandomObject();
Map<Integer, String> mappy = new HashMap<Integer, String>();

mappy.put(1, "good map");
mappy.put(2, "nice map");
mappy.put(3, "wow");
mappy.put(4, "mappy the best map");

Map<Integer, String> collect = mappy.entrySet().stream()
    .filter(map -> map.getKey() == 2)
    .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
// Hmmm i don't know where to put randomObj

2 个答案:

答案 0 :(得分:1)

功能编程取决于不变性。

您没有更新流;你正在使用map,reduce,filter等操作创建一个新的那个。

答案 1 :(得分:0)

由于您使用的是Map,因此除了“使用流”之外,使用这样的样板代码是没有意义的,因为Map不能两次使用相同的键。

这是最佳解决方案

String s = mappy.get(2);
if (s==null) {
    throw new IllegalStateException("No value with key = 2 were present");
}
new RandomObject(2, s);

但是如果你真的想要使用流,我会看到三个解决方案:

丑陋的(即使它更快):

Map<Integer, String> collect = mappy.entrySet().stream()
    .filter(map -> map.getKey() == 2)
    .peek(entry -> {
        randomObj.seti1(entry.getKey());
        randomObj.sets1(entry.getValue());
    })
    .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));

peek()用于查看流的每个元素。它返回相同的流。 (但我不建议这样做。)

更好的一个(需要两次迭代):

Map<Integer, String> collect = mappy.entrySet().stream()
    .filter(map -> map.getKey() == 2)
    .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));

collect.entrySet().stream()
.forEach(entry -> {
    randomObj.seti1(entry.getKey());
    randomObj.sets1(entry.getValue());
});

更好的一个:

Optional<RandomObject> randomObj = mappy.entrySet().stream()
    .filter(map -> map.getKey() == 2)
    .mapToObj(entry -> new RandomObject(entry.getKey(), entry.getValue()))
    .findFirst();

if (!randomObj.isPresent()) {
    throw new IllegalStateException("No value with key = 2 were present");
}