为什么抽象类不能通过利用lambda实例化
抽象类,哪怕只声明了一个抽象方法,也不能使用lambda来实例化。
下面有两个类 Ordering 和 CacheLoader的例子,都带有一个抽象方法,摘自于Guava 库。那岂不是很高兴能够声明它们的实例,像这样使用lambda表达式?
Ordering order = (a, b) -> ...;
CacheLoader<String, String> loader = (key) -> ...;
로그인 후 복사
로그인 후 복사
这样做引发的最常见的争论就是会增加阅读lambda的难度。以这种方式实例化一段抽象类将导致隐藏代码的执行:抽象类的构造方法。
另一个原因是,它抛出了lambda表达式可能的优化。在未来,它可能是这种情况,lambda表达式都不会计算到对象实例。放任用户用lambda来声明抽象类将妨碍像这样的优化。
此外,有一个简单地解决方法。事实上,上述两个摘自Guava 库的实例类已经证明了这种方法。增加工厂方法将lambda转换成实例。
Ordering<String> order = Ordering.from((a, b) -> ...);
CacheLoader<String, String> loader = CacheLoader.from((key) -> ...);
로그인 후 복사
로그인 후 복사
要深入阅读,请参看由 Brian Goetz所做的说明: response to "Allow lambdas to implement abstract classes"。
Java8의 새로운 기능은 무엇입니까?
翻译于 4年前
2人顶
顶 翻译得不错哦!
java.util.function
패키지 요약: java.util.function
Comparator 및 Runnable의 초기 증거로 JDK에 이미 정의된 인터페이스는 기능적 인터페이스로 람다 표현식과 호환됩니다. 같은 방식으로 자신의 코드에서 기능적 인터페이스나 타사 라이브러리를 정의할 수 있습니다.
하지만 이전 JD 카드에는 없었던, 광범위하고 보편적인 특정 형태의 기능 인터페이스가 있습니다. 새로운 java.util.function 패키지에 많은 수의 인터페이스가 추가되었습니다. 그 중 일부는 다음과 같습니다.
Function -T를 입력으로, R을 출력으로 반환
Predicate -T를 입력으로, 부울 값을 출력으로 반환
Consumer< ;T> ; - T를 입력으로, 일부 작업을 수행하지만 반환 값 없음
Supplier - 입력 없음, T
BinaryOperator -T 2개를 출력으로 반환, " 감소" 작업
이러한 가장 원시적인 기능도 존재합니다. int, long, double로 제공됩니다. 예를 들면 다음과 같습니다.
여기에는 주로 입력 또는 출력 중에 boxing 및 unboxing 작업을 피하기 위한 몇 가지 성능상의 이유가 있습니다.
PM을 기다리는 중
4년 전 번역됨
2People's top
top 번역 잘했어요!
모든 번역은 이 기사에만 해당 학습 및 의사소통을 위해 재인쇄 시 이 기사의 번역자, 출처 및 링크를 반드시 표시하시기 바랍니다
저희 번역 작업은 CC 계약을 준수합니다. 당사의 작업이 귀하의 권리를 침해하는 경우 제때에 연락해 주세요
위 내용은 Java8의 새로운 기능은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!