首页 > 解决方案 > 如何从流中检索过滤值并使用它

问题描述

我是 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

解决方案


如果您使用 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()

推荐阅读