java8 streams-从对象列表中收集多个整数字段

umuewwlo  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(388)

这个问题在这里已经有了答案

如何将一个对象的两个字段收集到同一个列表中(1个答案)
29天前关门了。
例如,我有一个类:

public class Period {
    private Integer from;
    private Integer to;
}

还有一个json格式的对象列表:

[
    {
        "from": 1,
        "to": 2
    }, {
        "from": 3,
        "to": 4
    }, {
        "from": 5,
        "to": 6
    }
]

我想从银行取钱 List<Period> periods ,将这两个字段中的所有值合并到一个集合中。在我的情况下是这样的 List<Integer> values . 有没有可能使用 streamperiods 列表?我试着做这样的东西:

values = periods
            .stream()
            .mapToInt(p -> p.getFrom())
            .boxed()
            .collect(Collectors.toList());
values.addAll(
     periods
        .stream()
        .mapToInt(p -> p.getTo())
        .boxed()
        .collect(Collectors.toList()));

对上一个json执行此操作的结果是:

[1,2,3,4,5,6]

是否有任何其他选项可以通过流操作来实现相同的结果?

wgmfuz8q

wgmfuz8q1#

您可以这样做:

List<Integer> list = periods.stream()
        .flatMap(m -> Stream.of(m.getFrom(), m.getTo()))
        .collect(Collectors.toList());
44u64gxh

44u64gxh2#

对于每个项目,创建两个属性的新流,并将它们展平。

periods.stream()
    .flatMap(p -> Stream.of(p.getTo(), p.getFrom()))
    .collect(Collectors.toList());
j0pj023g

j0pj023g3#

问题代码的输出是 [1, 3, 5, 2, 4, 6] (代替 [1, 2, 3, 4, 5, 6] ).
如果你想要这个输出,这里有一个不使用 Stream.flatMap :

List<Integer> values = Stream.concat(
        periods.stream().map(Period::getFrom),
        periods.stream().map(Period::getTo))
    .collect(Collectors.toList());

如果你想混合 from 以及 to 价值观,那么其他的答案应该有用。
正如评论中指出的,没有必要使用 Stream.mapToInt 然后 Stream.boxed ,因为这不必要地取消了整数值的装箱和装箱。

相关问题