java-8 - 如何从流中检索过滤值并使用它
问题描述
我是 Java 8 的新手:我必须将这段 Java 6 代码转换为 Java 8 版本:
List<String> unvalidnumbers = new ArrayList<>();
StringBuilder content = new StringBuilder();
String str = "current_user"
for (Iterator<String> it = numbers.iterator(); it.hasNext();) {
String number = it.next();
try {
PersIdentifier persIdentifier = this.getPersIdentifierByNumber(number);
if (persIdentifier != null) {
content.append(number).append(";").append(str);
if (StringUtils.equals(persIdentifier.getType(), "R")) {
content.append(";X");
}
if (it.hasNext()) {
content.append("\r\n");
}
}
} catch (BusException e) {
LOGGER.warn("Pers not found", e);
unvalidnumbers.add(number);
}
}
所以我写了这个:
numbers.stream().filter((String number) -> {
try {
return this.getPersIdentifierByNumber(number) != null;
} catch (BusinessException e1) {
LOGGER.warn("Pers not found", e1);
return false;
}
}).forEach(number -> contentConstruction.append(number).append(";").append(str));
我知道它缺少这部分:
if (StringUtils.equals(persIdentifier.getType(), "R")) {
content.append(";X");
}
if (it.hasNext()) {
content.append("\r\n");
}
但我没有找到方法来检索相应的 persIdentifier 对象。请有任何想法
解决方案
如果您使用 Java 8,则应该使用更实用的方法。
而不是forEach
, 赞成collect()
。这里Collectors.joining()
看起来很合适。
未经测试,但你应该有一个整体的想法:
String result =
numbers.stream()
.map(number -> new SimpleEntry<String, PersIdentifier>(number, this.getPersIdentifierByNumber(number) )
.filter(entry -> entry.getValue() != null)
.map(entry ->{
final String base = entry.getKey() + ";" + str;
return "R".equals(entry.getValue().getType()) ? base + ";X" : base;
})
.collect(joining("\r\n")); // Or not OS dependent : System.lineSeparator()
推荐阅读
- scala - 如何在结构化流中创建列的所有值的列表?
- eclipse - 我的 JUnit 测试使用 Java 11 中的 maven build 执行,但无法通过 RunIT->Run As->Units 运行相同的 Junit 测试,它总是说 not JUnits found
- spring-integration - 使用 Spring 从 pubsub 消费一批消息
- python - Python脚本监控点击事件但阻止它们,不允许点击事件通过
- python - 如何使用python解析表?
- javascript - 导航栏粘在html中无法正常工作
- c++ - 创建网格和启动窗口 SDL/GLEW C++ 时访问冲突
- jquery - 我想拆分一个对象并传递给我的 POJO setter
- regex - 正则表达式:如何替换 xml 属性中的所有嵌套双引号
- java - 不要在 JAVA 中从字符串的开头/结尾修剪制表符(\t)