同时迭代两个列表并使用流创建另一个列表

Par*_*agJ 9 java lambda java-stream

我想实现以下使用流:

List<MyObject> list1 = Arrays.asList(obj1, obj2, obj3);
List<Boolean> list2 = Arrays.asList(true, false, true);
List<MyObject> list = new ArrayList<>();
for(int i=0; i<list1.size();i++) {
     if(list2.get(i))
         list.add(list1.get(i));
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?它应该很简单,但我是java流的新手.

注意: list1和list2的长度始终相同.

use*_*037 12

你可以这样做:

List<MyObject> list = IntStream.range(0, list1.size())
    .filter(i->list2.get(i))
    .map(i->list1.get(i))
    .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

如果Java有内置zip流可能会更好 .例如,使用Guava,您可以使用:

 Streams.zip(list2.stream(), list1.stream(), (a,b) -> a ? b : null)
    .filter(Objects::nonNull)
    .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

  • 因为你从`IntStream`开始,你需要`mapToObj`.但你可以简化为`.filter(list2 :: get).mapToObj(list1 :: get)`... (2认同)