gpt4 book ai didi

lambda - 具有不兼容参数的 Java 8 Lambda 翻译

转载 作者:行者123 更新时间:2023-12-01 13:54:37 25 4
gpt4 key购买 nike

import org.junit.Test;

import java.util.stream.IntStream;

public class GomanTest {

@Test
public void someTest() {
IntStream.of(2, 3, 1).collect(Container::new, Container::add, null);
}
}


class Container<T> {

void add(T t) {
System.out.println("this is container " + t);
}
}

输出:

this is container 2
this is container 3
this is container 1

这在 1.8.0_45.jdk 上运行成功。 Container#add 如何转换为 ObjIntConsumer#accept?

最佳答案

方法Container.add是需要调用实例的实例方法。由于表格上的方法引用 ClassName::methodName未绑定(bind)到实例,Container::add具有 (Container<T>,T) 的功能签名.

因为您没有为 Container 指定类型参数也不是目标类型,编译器将推断 Container<Object> .所以Container::add具有推断的签名 (Container<Object>,Object)在这里,这适用于 accept ObjIntConsumer<Container<Object>>的方法| ,其签名为 (Container<Object>,int) .

第二个参数可以接受 int 类型的值,因为,在将它装箱到 Integer 之后, 它可以分配给 Object .

如果将结果分配给一个变量,则同样有效,从而提供一个目标类型,Container<Object>Container<Integer>喜欢

Container<Integer> collected
= IntStream.of(2, 3, 1).collect(Container::new, Container::add, null);

任何可以使用 Integer 的类型参数,例如SerializableNumber , 也会起作用。


您可以在 “What does ‘an Arbitrary Object of a Particular Type’ mean in java 8?” 中阅读更多关于对实例方法的无限引用的信息.


作为旁注,collect流的方法不应该接受 null参数和 Stream实现没有。那路过null使用原始流是当前实现和代码中的一个小故障 null很可能在下一个版本中被打破。作为Tagir Valeev pointed out , 行为已经changed在 Java 9 的当前开发状态​​下。

关于lambda - 具有不兼容参数的 Java 8 Lambda 翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32584049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com