标签: functional-interface

lambda 实际上是一个匿名类吗?

我正在阅读《Effective Java》,想知道lambda和之间的区别anonymous class。我知道 lambda 只能与具有单一方法的接口(即功能接口)一起使用,并且在 lambda 中您无法获取对其自身的引用,因此this当在匿名类关键字this与匿名类的主体相关时,关键字与指定 lambda 的类相关。但我不知道 lambda 到底是什么。我猜这只是一个创建实现函数式接口的匿名类实例的表达式,因此与普通匿名类相比,这只是带有一些限制的语法糖,但多亏了它,我们可以摆脱样板文件并使我们的代码更具可读性。另一方面,我们可以在这里阅读有关性能差异的信息,这表明 lambda 实际上不是实现函数接口的匿名类的实例。

java lambda anonymous-class java-8 functional-interface

5
推荐指数
1
解决办法
1684
查看次数

Java 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)

java generics lambda functional-interface method-reference

5
推荐指数
1
解决办法
619
查看次数

java.util.function包中功能接口的参数和返回类型的摘要

我正在寻找一个参数表和所有接口的单一抽象方法(SAM)的返回类型java.util.function.

java functional-programming functional-interface

4
推荐指数
1
解决办法
1780
查看次数

如何在Java 8中将带参数的lambda表达式作为参数传递?

这是我试过的.它甚至没有编译.

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应用的错误只需要一个参数)

lambda java-8 functional-interface

4
推荐指数
1
解决办法
4294
查看次数

功能接口的行为和方法参考

当属于变量的方法的引用被破坏时会发生什么?

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)

java generics java-8 functional-interface

4
推荐指数
1
解决办法
191
查看次数

在Stream.map()中将Consumer转换为Runnable

我正在尝试将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转换ConsumerRunnable

以下代码修复了该问题,但非常详细.

map(consumer -> (Runnable) (() -> consumer.accept(value)));
Run Code Online (Sandbox Code Playgroud)

有没有更简洁的方法来做到这一点?我知道我可以创建一个接受a Consumer并返回a 的静态方法Runnable,但我不认为这更简洁.

java eclipse java-stream functional-interface

4
推荐指数
1
解决办法
1802
查看次数

java 8 - 在HashMap中存储方法并从map中的方法获取返回值

我想将方法​​指针存储在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 lambda java-8 functional-interface

4
推荐指数
1
解决办法
5308
查看次数

方法参考 - 使用Consumer参数将Function传递给方法

我正在学习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明确传递时它不会执行它?

java-8 functional-interface method-reference

4
推荐指数
1
解决办法
115
查看次数

如何将非泛型接口扩展为通用接口?

我试图扩展,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)

java generics java-8 functional-interface

4
推荐指数
1
解决办法
88
查看次数

Java 8-具有嵌套对象的比较器

我正在编写一个比较器来比较两个员工对象。

在这里,我试图根据他们的部门来比较两个雇员对象,其后分别是他们的姓名和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)

comparator java-8 functional-interface

4
推荐指数
1
解决办法
782
查看次数