Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can a java lambda have more than 1 parameter?

In Java, is it possible to have a lambda accept multiple different types?

I.e: Single variable works:

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

Varargs also work:

    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 })));

But I want something that can accept many different types of arguments, e.g:

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

The main use is to have small inline functions inside functions for convenience.

I've looked around google and inspected Java's Function Package, but could not find. Is this possible?

like image 766
Leo Ufimtsev Avatar asked Sep 26 '22 07:09

Leo Ufimtsev


People also ask

Can lambda have multiple parameters Java?

The lambda expressions are easy and contain three parts like parameters (method arguments), arrow operator (->) and expressions (method body). The lambda expressions can be categorized into three types: no parameter lambda expressions, single parameter lambda expressions and multiple parameters lambda expressions.

Can lambda have multiple parameters?

A lambda function can have any number of parameters, but the function body can only contain one expression.

How many arguments can a lambda function have?

A lambda function can take any number of arguments, but can only have one expression.

Can a method in Java have more than one parameter?

Parameters are specified after the method name, inside the parentheses. You can add as many parameters as you want, just separate them with a comma.

How many parameters can a lambda expression have in Java?

How many parameters can a lambda expression have in Java? The lambda expressions are easy and contain three parts like parameters (method arguments), arrow operator (->) and expressions (method body).

How to store a lambda expression in a variable?

The lambda expression should have the same number of parameters and the same return type as that method. Java has many of these kinds of interfaces built in, such as the Consumer interface (found in the java.util package) used by lists. Use Java's Consumer interface to store a lambda expression in a variable:

What are the different types of lambda expressions?

The lambda expressions are easy and contain three parts like parameters (method arguments), arrow operator (->) and expressions (method body). The lambda expressions can be categorized into three types: no parameter lambda expressions, single parameter lambda expressions and multiple parameters lambda expressions.

How do I print every item in a list using lambda expressions?

Lambda expressions are usually passed as parameters to a function: Use a lamba expression in the ArrayList 's forEach () method to print every item in the list: Lambda expressions can be stored in variables if the variable's type is an interface which has only one method.


2 Answers

It's possible if you define such a functional interface with multiple type parameters. There is no such built in type. (There are a few limited types with multiple parameters.)

@FunctionalInterface
interface Function6<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 {
    Function6<String, Integer, Double, Void, List<Float>, Character> func = (a, b, c, d, e) -> 'z';
}

I've called it Function6 here. The name is at your discretion, just try not to clash with existing names in the Java libraries.


There's also no way to define a variable number of type parameters, if that's what you were asking about.


Some languages, like Scala, define a number of built in such types, with 1, 2, 3, 4, 5, 6, etc. type parameters.

like image 212
Sotirios Delimanolis Avatar answered Oct 19 '22 11:10

Sotirios Delimanolis


For something with 2 parameters, you could use BiFunction. If you need more, you can define your own function interface, like so:

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

If there is more than one parameter, you need to put parentheses around the argument list, like so:

FourParameterFunction<String, Integer, Double, Person, String> myLambda = (a, b, c, d) -> {
    // do something
    return "done something";
};
like image 59
tbodt Avatar answered Oct 19 '22 10:10

tbodt