【问题标题】:Method references with a parameter带参数的方法引用
【发布时间】:2014-08-24 05:06:53
【问题描述】:

在 Java 8 中,具有以下类

 class Person {

    private boolean born;

    Person() {
    }

    public void setBornTrue() {
        born = true;
    }

    public void setBorn(boolean state) {
        born = state;
    }

  }

可以通过方法引用调用 setBornTrue 方法:

    ArrayList<Person> people = new ArrayList<>();
    people.add(new Person());

    people.forEach(Person::setBornTrue);

但是我将如何使用 forEach 方法并使用 方法引用 使用 setBorn?尝试:

    people.forEach(Person::setBorn);

导致错误“无法解析方法 setBorn”。

另外,我将如何传递 True 的值?

【问题讨论】:

  • 你想达到什么目的?这是错误的 - people.add(new Person(null));people.forEach(Person::setBornTrue);
  • people.add(new Person(null)); 这条线对吗?为什么为空?你的代码对我有用,但如果你删除了null
  • 剪切和粘贴错误...删除了空值。
  • 我想知道为什么这也不可能。
  • 看一下MethodHandle,它太复杂了,一点也不像C++中的std::bind

标签: java lambda


【解决方案1】:

使用 lambda:

people.forEach((p) -> p.setBorn(true));

仅使用 java 8 API 没有发现其他方法。


使用这个自定义函数:

public static <T, U> Consumer<T> bind2(BiConsumer<? super T, U> c, U arg2) {
    return (arg1) -> c.accept(arg1, arg2);
}

你可以这样做:

people.forEach(bind2(Person::setBorn, true));

如果这种实用方法在 java API 或库中可用,请告诉我们。

【讨论】:

  • 是的......虽然上面的答案是如何设置这个 without 方法引用,有没有办法编码这个 with 方法参考?
  • @user465342 更新了另一种解决方案,它不是纯 java,而是使用方法引用。
  • 非常令人印象深刻!有没有你用来创建它的参考?一直在寻找好的资源。
猜你喜欢
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
  • 2015-02-21
  • 2015-07-29
相关资源
最近更新 更多