java匿名函数 java lambda可以有多个参数吗?




java函数对象 (4)

对于这种情况,您可以使用默认库(java 1.8)中的接口:

java.util.function.BiConsumer
java.util.function.BiFunction

在界面中有一个小的(不是最好的)默认方法的例子:

default BiFunction<File, String, String> getFolderFileReader() {
    return (directory, fileName) -> {
        try {
            return FileUtils.readFile(directory, fileName);
        } catch (IOException e) {
            LOG.error("Unable to read file {} in {}.", fileName, directory.getAbsolutePath(), e);
        }
        return "";
    };
}}

在Java中,是否有可能让lambda接受多种不同的类型?

即:单个变量的作品:

    Function <Integer, Integer> adder = i -> i + 1;
    System.out.println (adder.apply (10));

可口可乐也工作:

    Function <Integer [], Integer> multiAdder = ints -> {
        int sum = 0;
        for (Integer i : ints) {
            sum += i;
        }
        return sum;
    };

    //.... 
    System.out.println ((multiAdder.apply (new Integer [] { 1, 2, 3, 4 })));

但我想要一些可以接受许多不同类型参数的东西,例如:

    Function <String, Integer, Double, Person, String> myLambda = a , b, c, d->  {
    [DO STUFF]
    return "done stuff"
    };

主要用途是为了方便起见在函数内部有小的内联函数。

我查看了谷歌并检查了Java的功能包,但找不到。 这可能吗?

[已解决,谢谢!]

@Sotirios Delimanolis实现界面的方式适用于我。

根据他的语法,我做了这个简化的工作示例。 (如果用于任何人阅读......)我注意到,你必须命名接口除了'Function'以外,因为它与内置的java.util.Function冲突。

public class main {

    @FunctionalInterface
    interface Function3 <A, B, C, R> { 
    //R is like Return, but doesn't have to be last in the list nor named R.
        public R apply (A a, B b, C c);
    }

    public static void main (String [] args) {
        Function3 <String, Integer, Double, Double> multiAdder = (a, b, c) -> {
            return Double.parseDouble (a) + b + c;
        };
        System.out.println (multiAdder.apply ("22.4", 2, 40.0));
    }
}

我只会实现一堆接口,一个接口有3个参数,一个接口有4个接口。


Answer #1

另一种方法,不确定这是否适用于您的特定问题,但对于某些可能适用的方法是在java.util.function库中使用UnaryOperator 。 它返回你指定的相同类型,所以你把所有的变量放在一个类中,并且它是一个参数:

public class FunctionsLibraryUse {

    public static void main(String[] args){
        UnaryOperator<People> personsBirthday = (p) ->{
            System.out.println("it's " + p.getName() + " birthday!");
            p.setAge(p.getAge() + 1);
            return p;
        };
        People mel = new People();
        mel.setName("mel");
        mel.setAge(27);
        mel = personsBirthday.apply(mel);
        System.out.println("he is now : " + mel.getAge());

    }
}
class People{
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

所以你有这个类,在这个例子中, Person可以有很多实例变量,并且不需要改变你的lambda表达式的参数。

对于那些感兴趣的人,我写了关于如何使用java.util.function库的笔记: http://sysdotoutdotprint.com/index.php/2017/04/28/java-util-function-library/ : http://sysdotoutdotprint.com/index.php/2017/04/28/java-util-function-library/


Answer #2

如果你用多个类型参数定义这样一个功能接口是可能的。 没有这样的内置类型。 (有多种参数的有限类型。)

@FunctionalInterface
interface Function<One, Two, Three, Four, Five, Six> {
    public Six apply(One one, Two two, Three three, Four four, Five five);
}

public static void main(String[] args) throws Exception {
    Function<String, Integer, Double, Void, List<Float>, Character> func = (a, b, c, d, e) -> 'z';
}

如果这就是你所问的,也没有办法定义可变数量的类型参数。

一些语言,如Scala,定义了一些内置这种类型的参数,其中包含1,2,3,4,5,6等类型的参数。


Answer #3

对于有2个参数的东西,你可以使用BiFunction 。 如果您需要更多,您可以定义您自己的功能界面,如下所示:

@FunctionalInterface
public interface FourParameterFunction<T, U, V, W, R> {
    public R apply(T t, U u, V v, W w);
}

如果有多个参数,则需要在参数列表中放置括号,如下所示:

FourParameterFunction<String, Integer, Double, Person, String> myLambda = (a, b, c, d) -> {
    // do something
    return "done something";
};




java-8