Java 람다는 둘 이상의 매개 변수를 가질 수 있습니까?
Java에서 람다가 여러 유형을 허용하도록 할 수 있습니까?
즉 : 단일 변수 작동 :
Function <Integer, Integer> adder = i -> i + 1;
System.out.println (adder.apply (10));
Varargs도 작동합니다.
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"
};
주요 용도는 편의를 위해 함수 내부에 작은 인라인 함수를 사용하는 것입니다.
Google을 둘러 보았고 Java 기능 패키지를 검사했지만 찾을 수 없었습니다. 이게 가능해?
여러 유형 매개 변수를 사용하여 이러한 기능적 인터페이스를 정의하면 가능합니다. 이러한 내장 유형은 없습니다. (여러 매개 변수가있는 몇 가지 제한된 유형이 있습니다.)
@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';
}
원하는 유형의 변수 매개 변수를 정의 할 수있는 방법도 없습니다.
스칼라와 같은 일부 언어는 1, 2, 3, 4, 5, 6 등의 유형 매개 변수를 사용하여 이러한 유형으로 내장 된 여러 언어를 정의합니다.
매개 변수가 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 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 "";
};
}}
람다를 사용하려면 다음과 같이 세 가지 유형의 작업이 있습니다.
1. 매개 변수 수락-> 소비자
2. 테스트 매개 변수 반환 부울-> 조건 자
3. 매개 변수 및 반환 값 조작-> 함수
Java Functional interface upto two parameter:
Single parameter interface
Consumer
Predicate
Function
Two parameter interface
BiConsumer
BiPredicate
BiFunction
For more than two, you have to create functional interface as follow(Consumer type):
@FunctionalInterface
public interface FiveParameterConsumer<T, U, V, W, X> {
public void accept(T t, U u, V v, W w, X x);
}
Another alternative, not sure if this applies to your particular problem but to some it may be applicable is to use UnaryOperator
in java.util.function library. where it returns same type you specify, so you put all your variables in one class and is it as a parameter:
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;
}
}
So the class you have, in this case Person
, can have numerous instance variables and won't have to change the parameter of your lambda expression.
For those interested, I've written notes on how to use java.util.function library: http://sysdotoutdotprint.com/index.php/2017/04/28/java-util-function-library/
You could also use jOOL library - https://github.com/jOOQ/jOOL
It has already prepared function interfaces with different number of parameters. For instance, you could use org.jooq.lambda.function.Function3
, etc from Function0
up to Function16
.
참고URL : https://stackoverflow.com/questions/27872387/can-a-java-lambda-have-more-than-1-parameter
'development' 카테고리의 다른 글
A와 A가 없음이 아닌 경우 : (0) | 2020.06.28 |
---|---|
LaTeX : 텍스트 범위에서 줄 바꿈 방지 (0) | 2020.06.28 |
Android M 권한 : shouldShowRequestPermissionRationale () 함수 사용에 혼란 (0) | 2020.06.27 |
Chrome을 사용하여 요소에 바인딩 된 이벤트를 찾는 방법 (0) | 2020.06.27 |
대소 문자를 구분하지 않는 'in'-Python (0) | 2020.06.27 |