public static void main(String[] args) {
List<String> list1 = Arrays.asList("aaa", "bbb", "ccc");
List<Integer> list2 = Arrays.asList(1, 2, 3);
List<Foo> list3 = Arrays.asList(new Foo(),new Foo(),new Foo());
for (int i=0;i<list1.size();i++) {
System.out.println(output(list1.get(i),list2.get(i),list3.get(i),i));
}
}
private static String output(String first, Integer second, Foo third, int index) {
return first + second + third.get(index);
}
public class Foo {
public int get(int i)
{
return i;
}
}
aaa10
bbb21
ccc32
Stream test = IntStream.range(0,list1.size())
.Stream.concat(Stream.of(list1),Stream.of(list2),Stream.of(list3)).map(this::output).map(xxx::get)
.collect(Collectors.toList())
.forEach(System.out::println);
xxx
部分应该输入什么,就卡在这里了。map
。public class Bar {
String list1;
Integer list2;
Foo list3;
Bar(String list1Con,Integer list2Con,Foo list3Con){
list1 = list1Con;
list2 = list2Con;
list3 = list3Con;
}
public Map<String,Object> get(int index) {
return new HashMap<String,Object>() {{
put("list1",list1);
put("list2",list2);
put("list3",list3.get(index));
}};
}
}
List<Bar> listBar = Arrays.asList(
new Bar("aaa",1,new Foo()),
new Bar("bbb",2,new Foo()),
new Bar("ccc",3,new Foo()));
IntStream.range(0, listBar.size()).mapToObj(listBar::get).map(Bar::get).map(Map::values).forEach(System.out::println);
mapToObj
之后的参数来应用到Bar::get
框架挑战:
你的问题不在于流的用途。
典型的流用法是:拥有一些集合(或类似的源),独立操作该集合的每个元素,并返回一些结果。
你没有单一的收集源,也不需要结果,你只有一个副作用(打印)。流的力量(例如并行执行)可能会打破你的预期,副作用按顺序发生
抱歉,我是使用流的新手。
如果您找到或编写一个适配器,该适配器从您的三个列表创建一个三元组流(String/Integer/Foo),然后使用流函数对该流进行操作,则可以使其工作,但我建议不要遵循这条路,直到您获得更多关于流的经验。
总的来说,我没有看到将每个循环转换为流表达式的好处。在很多情况下,流使您的代码更简洁、更具可读性,但在您的情况下,恕我直言,循环完全没问题。
您有三个大小相等的列表,并且具有相同索引的元素属于在一起。大多数时候,这暗示这三个东西(String、Integer 和 Foo)的组合具有域含义,并且值得拥有一个自己的类(我们称之为
MyCombination
,当然我不这么认为)不知道您的域中的正确名称是什么)。
然后你的三列表问题就消失了,你只有一个
List<MyCombination>
,你可以轻松地应用流函数。