【问题标题】:How should I design this method in order to take a list of lambda expressions as an input?我应该如何设计此方法以将 lambda 表达式列表作为输入?
【发布时间】:2020-07-02 01:13:04
【问题描述】:

我有以下任务:

设计一个类,其对象具有方法:

  • setValue,给定一个字符串和一个整数值,将值与变量的名词相关联

  • getValue 返回与给定字符串关联的整数值

  • execute 依次调用给定的 lambda 表达式列表,其中每个表达式获取类的一个实例,不返回任何内容,并通过方法 setValue 作用于类获取值

因此,例如,在以下之后:

MyClass instance = new MyClass();

instance.execute(List.of(e -> e.setValue("x", 1),
                           e -> e.setValue("y", 2)));

instance 应该包含值 1 表示“x”,2 表示“y”。


这是我到目前为止所做的,我认为还可以:

public class MyClass {

private Map<String,Integer> map;

public int getValue(String name) {return map.get(name);}

public void setValue(String name, int value) {map.put(name, value);}

我没有看到execute 的路要走。我知道我需要这些 lambda 表达式的功能接口,但是我无法解决 Eclipse 在编写 instance.execute(List.of(...)) 时显示的错误,例如“List 类型中的方法of(Object, Object) 不适用于参数((&lt;no type&gt; e) -&gt; {}, (&lt;no type&gt; e) -&gt; {})。 我怎样才能让它发挥作用?

【问题讨论】:

    标签: java class inheritance lambda


    【解决方案1】:

    您需要提供Consumer&lt;MyClass&gt; 的列表。 Consumer 是一个功能接口,带有一个名为 accept 的抽象方法,它对给定的参数执行操作。试试这个。

    public void execute(List<Consumer<MyClass>> list) {
        list.forEach(cons -> cons.accept(this));
    }
    

    List::of 的问题是您必须使用 Java 9,或者您可以简单地这样做。

    public void execute(Consumer<MyClass> ...list) {
        Stream.of(list).forEach(cons -> cons.accept(this));
    }
    

    【讨论】:

      【解决方案2】:

      你有它倒退:如果你想为多个值调用方法,这些值就是流。假设您有一个代表您的 "x": 1 数据集的 Map&lt;String, Integer&gt;,您可以这样做:

      valuesMap.entrySet().stream()
          .forEach(entry -> instance.setValue(entry.getKey(), entry.getValue());
      

      不过,鉴于您的问题陈述,您似乎被要求做一些更接近Visitor pattern 的事情。在这种情况下,您需要一个用于实现 lambda 的接口,并且有一个内置接口:Consumer&lt;MyClass&gt;。你应该熟悉这个以及SupplierFunction,因为它们很常见。

      如果您声明您的 execute 方法来获取这些列表,那么您可以使用 for 循环或流来处理它们,或者使用方便的内置 forEach 方法:

      public void execute(List<Consumer<MyClass>> consumers) {
          consumers.forEach(consumer -> consumer.accept(this));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2010-12-04
        相关资源
        最近更新 更多