为了账号安全,请及时绑定邮箱和手机立即绑定

使用 java 8 流基于另一个 List<Object2> 填充 List<Object1>

使用 java 8 流基于另一个 List<Object2> 填充 List<Object1>

犯罪嫌疑人X 2023-04-13 14:52:36
我有2个ListList<Obligation>,List<ObligationStatus> 结构如下:public class Obligation {    private String topic;    private String status;    private String comment;    private String text;}和public class ObligationStatus {    private String topic;    private String status;    private String comment;}status里面是所有元素, 填充在 我想设置的comment和从每个元素到每个元素的基础上。List<Obligation>nulltopicliststatuscommentList<ObligationStatus>List<Obligation>topic        // this is what i have tried, and is working fine        obList.stream().forEach(ob -> {            osList.stream().forEach(os -> {                if (ob.getTopic().equalsIgnoreCase(os.getTopic())) {                    ob.setStatus(os.getStatus());                    ob.setComment(os.getComment());                }            });        });// also tried to do this without using forEach, but compilation error here        List<Obligation> result = obList.stream()                .map(ob -> osList.stream().map(os -> os.getTopic().equals(ob.getTopic())).collect(Function.identity()))                .collect(Collectors.toList());我们可以不起诉就这样做吗forEach?任何信息都会有帮助。
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

为什么要为此使用流?Stream 不是改变对象的正确工具。


使用标准for循环。也使代码更易于理解。


List<Obligation> obligationList = ...;

List<ObligationStatus> statusList = ...;


// For better performance, make a map

Map<String, ObligationStatus> statusMap = new HashMap<>(statusList.size());

for (ObligationStatus status : statusList)

    statusMap.put(status.getTopic(), status);


// Assign status values

for (Obligation obligation : obligationList) {

    ObligationStatus status = statusMap.get(obligation.getTopic());

    if (status != null) {

        ob.setStatus(status.getStatus());

        ob.setComment(status.getComment());

    }

}

如果你想做一些流逻辑,第一部分是一个很好的选择:


// For better performance, make a map

Map<String, ObligationStatus> statusMap = statusList.stream()

        .collect(Collectors.toMap(ObligationStatus::getTopic, Function.identity()));

更新


注意到问题代码equalsIgnoreCase(...)在比较topic值时做了。如果确实需要,请将 更改HashMap为不区分大小写TreeMap:


Map<String, ObligationStatus> statusMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

流版本变得复杂,所以最好保持旧式。


查看完整回答
反对 回复 2023-04-13
?
万千封印

TA贡献1891条经验 获得超3个赞

由于您正在修改现有的List,因此无需使用collect.


但是,您可以使用单个forEach. 可以使用和来定位ObligationStatus与实例匹配的实例。ObligationfilterfindFirst


obList.stream().forEach(ob -> {

    osList.stream()

          .filter(os -> ob.getTopic().equalsIgnoreCase(os.getTopic()))

          .findFirst()

          .ifPresent (os -> {

              ob.setStatus(os.getStatus());

              ob.setComment(os.getComment());

          });

});


查看完整回答
反对 回复 2023-04-13
  • 2 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信