将 for 循环转换为 Java 8 Stream

问题描述 投票:0回答:1

我需要将这些代码转换为 Java 8 Stream 我使用我编写的下面给出的代码进行了尝试,但仍然没有得到我想要的。

//contractList is list of Contract class
//contract.getProgramId() returns String
//contract.getEnrollmentID() returns String
//'usage = CommonUtils.getUsageType()' is other service to call which returns String
//enroll and usage are String type
//enrollNoWithUsageTypeJson is json object '{"enroll": value, "usage": value}'
//usages is List<JSONObject> where enrollNoWithUsageTypeJson need to add

for (Contract contract : contractList) {
    if (!StringUtils.isEmpty(contract.getProgramId())) {
        enroll = contract.getEnrollmentID();
        usage = CommonUtils.getUsageType(envProperty, contract.getProgramId());
        if (!(StringUtils.isEmpty(enroll) || StringUtils.isEmpty(usage))) {
            enrollNoWithUsageTypeJson.put("enroll", enroll);
            enrollNoWithUsageTypeJson.put("usage", usage);
            usages.add(enrollNoWithUsageTypeJson);
        }
    }
}

这是到目前为止我所得到的:

contractList.stream()
    .filter(contract -> !StringUtils.isEmpty(contract) &&
            !StringUtils.isEmpty(contract.getProgramId()))

    .collect(Collectors.to);

提前谢谢您

java-8 java-stream
1个回答
4
投票

以下是基于流的代码版本的外观(根据需要添加静态导入):

List<JSONObject> usages = contractList.stream()
    .filter(c -> isNotEmpty(c.getProgramId()))
    .map(c -> new SimpleEntry<>(c.getEnrollmentID(), getUsageType(envProperty, c.getProgramId())))
    .filter(e -> isNotEmpty(e.getKey()) && isNotEmpty(e.getValue())))
    .map(e -> {
        enrollNoWithUsageTypeJson.put("enroll", e.getKey());
        enrollNoWithUsageTypeJson.put("usage", e.getValue());
        return enrollNoWithUsageTypeJson; })
    .collect(toList());

我冒昧地使用了 Apache Commons 中的

isNotEmpty
,因为这个选项
!isEmpty
看起来很糟糕。我(ab)使用
AbstractMap.SimpleEntry
来保存一对值。如果你觉得
getKey
getValue
使代码可读性较差,你可以引入一个类来保存这2个变量。例如:

class EnrollUsage {
    String enroll, usage;
}

您可能还喜欢定义一个方法:

JSONObject withEnrollAndUsage(JSONObject json, String enroll, String usage) {
    json.put("enroll", enroll);
    json.put("usage", usage);
    return json;
}

并在上面使用:

.map(e -> withEnrollAndUsage(enrollNoWithUsageTypeJson, e.getKey(), e.getValue()))

请记住,您永远不会真正“需要”将代码转换为使用流。在某些情况下,使用流虽然在智力上令人满意,但实际上使代码变得复杂。在这种情况下请运用您的最佳判断力。

© www.soinside.com 2019 - 2024. All rights reserved.