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

时间:2019-07-23 05:39:53

标签: java list java-8 java-stream

我有2个List
List<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> 对于所有元素,
null都填充了topic
我想基于liststatus的每个元素中的commentList<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()); 来这样做吗?
任何信息都会有所帮助。

2 个答案:

答案 0 :(得分:2)

由于您正在修改现有的react-native run-android ,因此无需使用react-native run-ios

但是,您可以使用单个List。可以使用collectforEach找到与ObligationStatus实例匹配的Obligation实例。

filter

答案 1 :(得分:2)

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

使用标准的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.put(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);

该流的版本令人费解,因此最好保持其过时。