【问题标题】:How to create a default list using Java 8 streams?如何使用 Java 8 流创建默认列表?
【发布时间】:2021-10-07 16:28:53
【问题描述】:

我有一个对象商店如下。在主要功能中,我正在尝试处理一个列表。如果它的结果​​是一个空列表,那么我将创建一个默认列表,然后进一步处理它。我不知道如何创建一个默认列表,然后使用 java 8 流一起进一步处理它。 在第 1 节中,我正在处理一个列表。在第 2 节中,我正在创建第 1 节返回空列表的默认列表。在第 3 节中,我正在进一步处理第 1 节和第 2 节的结果。

class Shop {
    String name;
    String value;

    public Shop(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}


class Product {
    List<Shop> list = new ArrayList<>();

    public List<Shop> getList() {
        return list;
    }

    public void setList(List<Shop> list) {
        this.list = list;
    }
}

public class Test {
    public static void main(String[] args) {
        Shop s1 = new Shop("zip", "32684");
        Shop s2 = new Shop("loc", "abc");
        Shop s3 = new Shop("zip", "32684");
        Shop s4 = new Shop("brand", "lemom");

        List<Shop> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);

        Product p = new Product();
        p.setList(list);

        List<String> attributes = new ArrayList<>();
        attributes.add("zip");
        attributes.add("loc");
        attributes.add("brand");
        attributes.add("price");


        //How can I create a default list (section 2) if section 1 returns empty list. And then combine section 1 ,2 and 3 togethr using Java 8 Streams
         for (String attribute : attributes) {
            //section 1
            List<Shop> values = p.getList().stream()
                    .filter(shop -> attribute.equals(shop.getName()))
                    .collect(Collectors.toList());

            //section 2
            if (values.isEmpty()) {
                values.add(new Shop("zip", "3728392"));
            }

            //section 3
            List<String> list3 = new ArrayList<>();
            for (Shop shop : values) {
                list3.add(shop.getValue());
            }
            String result = String.join(",", list3);

        }
    }
}

【问题讨论】:

  • 不要在 Collectors.toList() 返回的列表上调用 add 方法,如 javadoc 所述 -> 不保证返回列表...。截至目前,toList 使用ArrayList::new,但它可能会如here 所述改变。所以最好使用toCollection(ArrayList::new)
  • 也许您应该发布预期的结果。确保它是具有不同名称、属性等的完整示例。

标签: java java-8 java-stream


【解决方案1】:
String a = p.getList().stream()
              .filter(shop -> attribute.equals(shop.getName()))
              .map(Shop::getValue)
              .collect(Collectors.collectingAndThen(Collectors.joining(","), 
                                     str -> str.isEmpty() ? "3728392" : str));

.map() 使用 Java 的双冒号运算符将您的 Object shop 转换为 String shop.getValue() - 这是您的第 3 部分。

自定义的.collect() 收集上一个操作中的所有值,并将它们转换为逗号分隔的字符串。如果结果字符串为空,则返回一个值——即您的第 2 节。

输出:

32684,32684
abc
lemom
3728392

【讨论】:

    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2016-03-28
    • 2013-04-02
    相关资源
    最近更新 更多