我需要将这些代码转换为 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);
提前谢谢您
以下是基于流的代码版本的外观(根据需要添加静态导入):
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()))
请记住,您永远不会真正“需要”将代码转换为使用流。在某些情况下,使用流虽然在智力上令人满意,但实际上使代码变得复杂。在这种情况下请运用您的最佳判断力。