Java8流-从对象列表中收集多个整数字段

Java8流-从对象列表中收集多个整数字段,java,collections,java-stream,Java,Collections,Java Stream,例如,我有一门课: public class Period { private Integer from; private Integer to; } 还有一个JSON格式的对象列表: [ { "from": 1, "to": 2 }, { "from": 3, "to": 4 }, { &quo

例如,我有一门课:

public class Period {
    private Integer from;
    private Integer to;
}
还有一个JSON格式的对象列表:

[
    {
        "from": 1,
        "to": 2
    }, {
        "from": 3,
        "to": 4
    }, {
        "from": 5,
        "to": 6
    }
]
我想从
列表中收集时段
,将这两个字段中的所有值收集到一个集合中。在我的例子中,它将是
列表值
。是否可以在
期间
列表中使用
?我试着做这样的东西:

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]

是否有任何其他选项可以在流上进行操作以实现相同的结果?

在周期上进行流操作,为每个项目创建两个属性的新流,并将其展平

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

您可以这样做:

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

您问题中的代码输出是
[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());
列表值=Stream.concat(
periods.stream().map(Period::getFrom),
periods.stream().map(Period::getTo))
.collect(Collectors.toList());
如果要混合使用
from
to
值,那么其他答案应该可以

正如评论中所指出的,没有必要使用
Stream.mapToInt
后跟
Stream.boxed
,因为这会不必要地取消装箱和装箱整数值。

.mapToInt(p->p.getFrom()).boxed()相当于
.map(p->p.getFrom())
。你只是不必要地拆箱和重新包装一切