我正在阅读《Effective Java》,想知道lambda和之间的区别anonymous class。我知道 lambda 只能与具有单一方法的接口(即功能接口)一起使用,并且在 lambda 中您无法获取对其自身的引用,因此this当在匿名类关键字this与匿名类的主体相关时,关键字与指定 lambda 的类相关。但我不知道 lambda 到底是什么。我猜这只是一个创建实现函数式接口的匿名类实例的表达式,因此与普通匿名类相比,这只是带有一些限制的语法糖,但多亏了它,我们可以摆脱样板文件并使我们的代码更具可读性。另一方面,我们可以在这里阅读有关性能差异的信息,这表明 lambda 实际上不是实现函数接口的匿名类的实例。
我有一个功能界面
import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
@FunctionalInterface
public interface SubmitterCompletable extends Submitter {
@Override
<T> CompletableFuture<T> submit(Callable<T> task);
}
Run Code Online (Sandbox Code Playgroud)
和两个函数
import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
public final class CompletableFutureUtils {
public static <U> CompletableFuture<U> runAsync(Callable<U> callable) {
// ...
}
public static <U> CompletableFuture<U> runAsync(Callable<U> callable, Executor executor) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我想SubmitterCompletable使用 lambda 表达式或方法引用从这些函数创建 s。第一个通过使用方法引用工作得很好。
SubmitterCompletable submitterCompletable = CompletableFutureUtils::runAsync;
Run Code Online (Sandbox Code Playgroud)
然而,对于第二个,我必须使用 lambda 表达式来传递 an Executor,但它不起作用。
Executor executor = /* ... */;
SubmitterCompletable submitterCompletable = c -> …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个参数表和所有接口的单一抽象方法(SAM)的返回类型java.util.function.
这是我试过的.它甚至没有编译.
public class LambdaExample {
public static Integer handleOperation(Integer x, Integer y, Function converter){
return converter.apply(x,y);
}
public static void main(String[] args){
handleOperation(10,10, Operation::add);
}
}
class Operation {
public int add(Integer x, Integer y){
return x+y;
}
}
Run Code Online (Sandbox Code Playgroud)
我想在这里努力实现的一些事情是:
1)如何传递lambda expression方法参数(在main上面的方法中)
2)如何将参数传递给函数(在 handleOpertion方法中,存在compilation应用的错误只需要一个参数)
当属于变量的方法的引用被破坏时会发生什么?
public class Hey{
public double bar;
public Hey(){
bar = 2.0d;
}
public double square(double num){
return Math.pow(num , bar);
}
}
Function<Double, Double> square;
whatsGonnaHappen: {
Hey hey = new Hey();
square = hey::square;
}//is hey still kept around because its method is being referenced?
double ans = square.apply(23d);
Run Code Online (Sandbox Code Playgroud) 我正在尝试将a转换Consumer为a Runnable.下面的代码并不会产生在Eclipse IDE中任何编译器错误.
Consumer<Object> consumer;
Runnable runnable;
Object value;
...
runnable = () -> consumer.accept(value);
Run Code Online (Sandbox Code Playgroud)
以下代码在Eclipse IDE中生成编译器错误.
ArrayList<Consumer<Object>> list;
Object value;
...
list.
stream().
map(consumer -> () -> consumer.accept(value));
Run Code Online (Sandbox Code Playgroud)
错误是:
Type mismatch: Can not convert from Stream<Object> to <unknown>.
The target type of this expression must be a functional interface.
Run Code Online (Sandbox Code Playgroud)
我如何帮助编译器将a转换Consumer为Runnable?
以下代码修复了该问题,但非常详细.
map(consumer -> (Runnable) (() -> consumer.accept(value)));
Run Code Online (Sandbox Code Playgroud)
有没有更简洁的方法来做到这一点?我知道我可以创建一个接受a Consumer并返回a 的静态方法Runnable,但我不认为这更简洁.
我想将方法指针存储在map中,以便根据字符串值执行它们.从我发现的,我可以Map<String, Runnable>用来做,但问题是我想从方法中获得返回值.
说我有这样的事情:
private Map<String, Runnable> timeUnitsMap = new HashMap<String, Runnable>() {{
timeUnitsMap.put("minutes", () -> config.getMinutesValues());
}}
Run Code Online (Sandbox Code Playgroud)
该方法config.getMinutesValues()来自另一个类.
我如何int value = timeUnitsMap.get("minutes").run();在地图中存储或存储其他内容(而不是Runnable)以便从地图中的函数中获取值?
我正在学习Java 8中的方法参考,我很难理解为什么这有效?
class Holder {
private String holded;
public Holder(String holded) {
this.holded = holded;
}
public String getHolded() {
return holded;
}
}
private void run() {
Function<Holder, String> getHolded = Holder::getHolded;
consume(Holder::getHolded); //This is correct...
consume(getHolded); //...but this is not
}
private void consume(Consumer<Holder> consumer) {
consumer.accept(null);
}
Run Code Online (Sandbox Code Playgroud)
正如您在run方法中看到的那样- Holder::getHolded返回未绑定的方法引用,您可以通过将类型的对象Holder作为参数传递来调用它.像这样:getHolded.apply(holder)
但是为什么它将这个未绑定的方法引用转换Consumer为直接作为方法参数调用的时候,并且在我Function明确传递时它不会执行它?
我试图扩展,TemporalAdjuster以便看起来像,
public interface TypedTemporalAdjuster<T extends Temporal & Comparable<? super T>> {
T adjustInto(T temporal);
}
Run Code Online (Sandbox Code Playgroud)
当我试图直接扩展基接口时,
public interface TypedTemporalAdjuster<T extends Temporal & Comparable<? super T>>
extends TemporalAdjuster {
T adjustInto(T temporal);
}
Run Code Online (Sandbox Code Playgroud)
我收到了一个错误.
... java:name clash:...有相同的擦除,但都没有覆盖另一个
有没有办法做到这一点?
到目前为止,我做到了.
public interface TypedTemporalAdjuster<T extends Temporal & Comparable<? super T>> { //extends TemporalAdjuster {
static <T extends Temporal & Comparable<? super T>> TypedTemporalAdjuster<T> of(
final Class<T> temporalClass, final TemporalAdjuster temporalAdjuster) {
return temporal -> temporalClass.cast(temporalAdjuster.adjustInto(temporalClass.cast(temporal)));
}
T adjustInto(T temporal);
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个比较器来比较两个员工对象。
在这里,我试图根据他们的部门来比较两个雇员对象,其后分别是他们的姓名和ID。
我在这里面临的问题是与原始对象的比较,并且它们的包装器很简单,但是当我尝试根据他们的部门比较两个雇员时,出现以下编译错误:
Employee类型未定义适用于此的getDept(T)
根据我的理解,即使部门getDept()也应扩展为
getDept(this)
同时作为功能调用并提供部门详细信息。
代码如下:
Employee.java
package com.deloitte.javatut.pojo;
public class Employee {
public Employee() {
// TODO Auto-generated constructor stub
}
private String emptName;
private Long empId;
private Department dept;
public String getEmptName() {
return emptName;
}
public void setEmptName(String emptName) {
this.emptName = emptName;
}
public Long getEmpId() {
return empId;
}
public void setEmpId(Long empId) {
this.empId = empId;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept …Run Code Online (Sandbox Code Playgroud)