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())
。你只是不必要地拆箱和重新包装一切