1
我試圖使用Stream
s從List
創建Map
。Java 8流:使用映射值列表映射到
的key
應該是原始項目的名稱,
的value
應該是一些派生的數據。
.map()
後的數據流由Integer
S和在.collect()
的時候,我不能從以前lambda
訪問「富」。我如何獲得.toMap()
中的原始項目?
這可以用Stream
s完成嗎?還是需要.forEach()
?
(以下代碼僅用於演示,實際代碼當然要複雜得多,我不能使doSomething()
爲Foo
的方法)。
import java.util.ArrayList;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class StreamTest {
public class Foo {
public String getName() {
return "FOO";
}
public Integer getValue() {
return 42;
}
}
public Integer doSomething(Foo foo) {
return foo.getValue() + 23;
}
public Map<String, Integer> run() {
return new ArrayList<Foo>().stream().map(foo -> doSomething(foo)).collect(Collectors.toMap(foo.getName, Function.identity()));
}
public static void main(String[] args) {
StreamTest streamTest = new StreamTest();
streamTest.run();
}
}
啊我看,所以轉換不是用.map()完成的,而是在收集階段? – lilalinux
我不確定這是否是唯一的選擇,但我相信這是在這種情況下做收集器內部映射的最簡單的解決方案。 @lilalinux –
花了我幾秒鐘才明白爲什麼'new Foo()'應該是一個數組。如果你想要一個單一的元素流,你可以直接使用'Stream.of(new Foo())'而不會讓讀者感到困惑...... – Holger