Java 8 流使用 3 个不同的谓词进行赋值

问题描述 投票:0回答:1

假设我有一个类型的 Java 8 对象列表。并且该对象具有字段年龄。 我想找到一种 Java 8/stream 的方式来表示,如果年龄为 12,则分配给变量age12,如果年龄为 8,则分配给变量age8,如果年龄为10,则分配给变量age10,所有这些都在一次传递中完成。 我知道我可以有 3 个变量并执行一个 for 循环并实现它。 我怎样才能用流做到这一点?

java java-8
1个回答
0
投票

如果我从字面上理解你,你想将年龄分配给它正确命名的字段。要在没有显式条件将年龄与字段相匹配的流中执行此操作,您可以使用反射。

  • 首先,在列表中声明一些对象。
  • 然后流式传输对象并构造字段并将值分配给该字段。

以下示例打印

age8 = 8
age10 = 10
age12 = 12

方法

public class ToFields {

    int age8;
    int age10;
    int age12;
    public static void main(String[] args) {
        new ToFields().start();
    }
    public void start() {
        List<MyObject> list = Arrays.asList(new MyObject(8),new 
                           MyObject(10), new MyObject(12));
        list.stream()
          .forEach(obj->{
             try {           
                  this.getClass().getDeclaredField("age"+obj.getAge())
                 .set(this, obj.getAge()); 
             } catch(Exception e) {
                  e.printStackTrace();
             }
           });
     System.out.println("age8 = " + age8);
     System.out.println("age10 = " + age10);
     System.out.println("age12 = " + age12);
    }
}

class MyObject {
  int age;
  public MyObject(int age) {
      this.age = age;
  }
  public int getAge() {
      return age;
  }
  
}

但是,在我看来,这充满了问题,而且不是一个很好的设计。我建议您简单地流式传输它们并将其存储在映射中,其中键按上述方式动态构造并分配伴随的值。

这就是它的样子。

  • toMap
    的第一个参数是
    key
  • 第二个是
    value
  • (a,b)->a
    - 是组合器。在这种情况下,它通过简单地将第一个存储在映射中来避免抛出重复的键异常。
Map<String, Integer> result = list.stream()
        .collect(Collectors.toMap(obj -> "age" + obj.getAge(),
                                           MyObject::getAge,
                                           (a,b)->a));
result.entrySet().forEach(System.out::println);

打印

age8=8
age12=12
age10=10

© www.soinside.com 2019 - 2024. All rights reserved.