猿问

Java 8 中的函数类级别参数

我想更加努力地使用 Java 8 的功能特性,并将我的思想转向那个范式;但是,我不太确定如何调和这种情况。


例如,我最近写了类似的东西:


public class ExampleClass {


    private ExampleData exampleData;

    private Function<ExampleData, Boolean> workFunction;


    public ExampleData getExampeData() {

        return exampleData;

    }


    public void setExampleData(ExampleData exampleData) {

        this.exampleData = exampleData;

    }


    public Function<ExampleData, Boolean> getWorkFunction() {

        return workFunction;

    }


    public void setWorkFunction(Function<ExampleData, Boolean> workFunction) {

        this.workFunction = workFunction;

    }

}

然后我继续像这样使用它......


public class Worker implements Callable {


    private final ExampleClass exampleClass;


    // ExampleClass serves as a container for the function and it's

    // input data in order to minimize the number of arguments

    // passed to this constructor. Otherwise would be

    // public Worker(ExampleData exampleData, Function<T, R> workFunction, ...) {

    // Note: using "..." here to represent more args.

    public Worker(ExampleClass exampleClass, ...) {

        this.exampleClass = exampleClass;

        ...

    }


    @Override

    public void call() {

        final Boolean isComplete = exampleClass.getWorkFunction().apply(exampleClass.getExampleData());

        if (isComplete) {

            ...

        }

        ...

    }

}

与我认为更传统的方法相比,上述方法是否更受欢迎?


public class ExampleClass {


    private ExampleData exampleData;


    public ExampleClass(ExampleData exampleData) {

        this.exampleData = exampleData;

    }


    public Boolean work() {

          return isComplete(exampleData);

    }

}

和实现类...


public class Worker implements Callable {


    private ExampleClass exampleClass;


    public Worker(ExampleClass exampleClass, ...) {

        this.exampleClass = exampleClass;

        ...

    }



如果我完全偏离了基础,那么使用 Java 8 的适当功能解决方案是什么?


更新:假设我的示例不返回布尔值。在使用 Java 8 进行函数式编程的上下文中,将函数作为类级别参数显式传递更好,还是仅使用传统的面向对象方式传递另一个执行该函数的类更好?


潇湘沐
浏览 301回答 2
2回答

暮色呼如

函数式编程的要点是函数必须被视为一个对象。但是你知道,函数(方法)不是java中的对象。它与 javascript 不同。所以,我们应该使用名为 Predicate 的接口。List<Apple> apples = new ArrayList<>();你想得到重量苹果。起初,List<Apple> weightApples = new ArrayList<>();for(int i = 0; 9< apples.size(); i++){&nbsp; &nbsp; if(apples.getWeight() > 10){&nbsp; &nbsp; &nbsp; &nbsp; weightApples.add(apples.get(i));&nbsp; &nbsp; }}这段代码。在函数式编程中,函数是“纯函数”。在纯函数中,应避免在函数中使用外部变量。而且,我们不关心“使用函数的行”中的函数逻辑首先,我们需要谓词接口。interface Predicate<T>{&nbsp; &nbsp; public boolean pass(T t);}通过泛型,我们可以扩展对象类型。我们可以制作过滤器。public static <T> List<T> filter(List<T> list, Predicate<T> predicate){&nbsp; &nbsp; List<T> result = new ArrayList<>();&nbsp; &nbsp; for(T el : list){&nbsp; &nbsp; &nbsp; &nbsp; if(predicate.pass(el)){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.add(el);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return result;}pass() 尚未实现。它可以由匿名类实现。最后,使用 lamda 将方法视为对象!filter(apples, (Apple apple) -> apple.getWeight()>10);我不是英语的人,所以英语很差。但我希望它对你有帮助!谢谢。

三国纷争

首先,接受一个参数并返回布尔值的函数应该实现Java 8Predicate。然而,在我看来,谓词并不是要取代任何和所有的if陈述。它们旨在用作 Java 8 集合流中的过滤器。您提供的示例似乎不适合这种情况。
随时随地看视频慕课网APP

相关分类

Java
我要回答