如何在java中使用流而不是for循环同时传输三个不同类型的列表

问题描述 投票:0回答:1

描述:

  • 三个列表大小始终相等。

示例代码:

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);
  • 显然它不起作用。抱歉,我是使用流的新手。
  1. 我不知道在
    xxx
    部分应该输入什么,就卡在这里了。
  2. 我也不知道如何在嵌套方法调用中使用
    map
  3. 我也不知道如何收集三种不同类型的列表。
  • 也许我应该使用地图来组织它们?

使用类来组织它们:

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);
  • 显然它也不起作用。
  1. 我不知道如何使用
    mapToObj
    之后的参数来应用到
    Bar::get

问题:

  • 如何在java中使用流而不是for循环同时遍历三个不同类型的列表。
java stream
1个回答
1
投票

框架挑战:

  • 在这种情况下使用流是个好主意吗,特别是对于流初学者来说?
  • 是否有更好的架构可以避免三并行列表问题?

使用流

你的问题不在于流的用途。

典型的流用法是:拥有一些集合(或类似的源),独立操作该集合的每个元素,并返回一些结果。

你没有单一的收集源,也不需要结果,你只有一个副作用(打印)。流的力量(例如并行执行)可能会打破你的预期,副作用按顺序发生

抱歉,我是使用流的新手。

如果您找到或编写一个适配器,该适配器从您的三个列表创建一个三元组流(String/Integer/Foo),然后使用流函数对该流进行操作,则可以使其工作,但我建议不要遵循这条路,直到您获得更多关于流的经验。

总的来说,我没有看到将每个循环转换为流表达式的好处。在很多情况下,流使您的代码更简洁、更具可读性,但在您的情况下,恕我直言,循环完全没问题。

建筑

您有三个大小相等的列表,并且具有相同索引的元素属于在一起。大多数时候,这暗示这三个东西(String、Integer 和 Foo)的组合具有域含义,并且值得拥有一个自己的类(我们称之为

MyCombination
,当然我不这么认为)不知道您的域中的正确名称是什么)。

然后你的三列表问题就消失了,你只有一个

List<MyCombination>
,你可以轻松地应用流函数。

© www.soinside.com 2019 - 2024. All rights reserved.