【问题标题】:Cant get java stream to work with arraylist无法让 java 流与 arraylist 一起使用
【发布时间】:2019-08-11 20:59:47
【问题描述】:

所以,我一直在玩一些 java 流,发现一些非常令人沮丧的事情。

我想列出这种类型的对象(客户),然后使用流过滤掉所有这些高兴 == 错误的对象。

package com.company;

public class Customer {

    public String name;
    public int points;
    public boolean glad;

    public Customer(String name, int points, boolean glad) {
        this.name = name;
        this.points = points;
        this.glad = glad;
    }

    public boolean isGlad() {
        return this.glad;
    }
}

每当我尝试使用常规数组时,一切似乎都正常:

Customer kunde1 = new Customer("jens", 20, true);
Customer kunde2 = new Customer("marie", 20, false);
Customer kunde3 = new Customer("niels", 20, false);
Customer kunde4 = new Customer("jens", 20, true);
Customer kunde5 = new Customer("jens", 20, true);

Customer[] kunderne = {kunde1,kunde2,kunde3,kunde4,kunde5};

Customer[] filtered = Stream.of(kunderne)
    .filter(Customer::isGlad)
    .toArray(Customer[]::new);

但每当我尝试从数组以外的东西(如 ArrayList)创建流时,我无法访问我的 lambda 语句中的对象属性

ArrayList<Customer> customers = new ArrayList<>();

Customer kunde1 = new Customer("jens", 20, true);
Customer kunde2 = new Customer("marie", 20, false);
Customer kunde3 = new Customer("niels", 20, false);
Customer kunde4 = new Customer("jens", 20, true);
Customer kunde5 = new Customer("jens", 20, true);

customers.add(kunde1);
customers.add(kunde2);
customers.add(kunde3);
customers.add(kunde4);
customers.add(kunde5);


Customer[] filtered = Stream.of(kunderne)
    .filter(Customer::isGlad)
    .toArray(Customer[]::new);

但这段代码甚至不会运行。为什么会发生这种情况,为什么它似乎只适用于数组?

【问题讨论】:

    标签: java arraylist java-stream


    【解决方案1】:

    没有Stream.of(List&lt;T&gt;) 这样的方法。 您应该使用cusomters.stream(),它将您的列表转换为流。

    【讨论】:

      【解决方案2】:

      发生这种情况是因为 Stream.of(cusomters) 正在创建一个包含 ArrayList 对象的元素 Stream - 显然没有方法

      public static boolean isGlad(ArrayList<Customer> customers) {
          return false;
      }
      

      这就是代码没有运行的原因

      当您将Customer[] 对象传递给Stream.of 而不是of 方法版本时

       public static<T> Stream<T> of(T t)
      

      重载

      public static<T> Stream<T> of(T... values)
      

      正在使用中,一切都很好

      【讨论】:

      • 哦,好吧,所以我不应该使用stream.of?
      • @AskSejsbo 当源是一个集合时,比如ArrayList,只需调用stream()就可以了。
      【解决方案3】:

      这就是你想要做的。

            Customer[] filtered = Stream.of(kunderne).filter(Customer::isGlad).map(
                  cust -> new Customer(cust.name, cust.points, cust.glad)).toArray(
                        Customer[]::new);
      
            for (Customer c : filtered) {
               System.out.println(c.name + " " + c.points + " " + c.glad);
            }
      

      您需要将过滤后的客户映射到新客户,然后将它们放入数组中。另一种选择是添加一个构造函数,该构造函数接受现有客户并将其用作输入。以下是它的工作原理。

            Customer[] filtered = Stream.of(kunderne).filter(Customer::isGlad).map(
                  Customer::new).toArray(Customer[]::new);
      
            for (Customer c : filtered) {
               System.out.println(c.name + " " + c.points + " " + c.glad);
            }
      
           // modified customer class with additional constructor
      
          class Customer {
             public String  name;
             public int     points;
             public boolean glad;
      
             public Customer(String name, int points, boolean glad) {
                this.name = name;
                this.points = points;
                this.glad = glad;
             }
      
             public Customer(Customer cust) {
                this(cust.name, cust.points, cust.glad);
             }
      
             public boolean isGlad() {
                return this.glad;
             }
          } 
      
      

      【讨论】:

      • 不错!谢谢!但这是否解决了无法访问属性的问题?
      • 第二种方法应该,如果您可以访问该类,则可以添加构造函数。但是,不知何故,必须有人能够访问这些属性。否则,这个类不会很有用。
      • 您可以随时使用Arrays.stream(kunderne) 创建流。
      • 最后一个建议。显然,您可以访问返回布尔值的 isGlad。如果您将getters 添加到类并设置字段private,您可以使用我展示的第一个流方法并且对类字段具有只读访问权限。
      猜你喜欢
      • 2017-06-23
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2018-01-02
      • 2016-11-14
      • 2015-02-01
      • 2019-05-10
      相关资源
      最近更新 更多