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 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';
}
나는 그것을 Function6
여기에 불렀다 . 이름은 재량에 따라 Java 라이브러리의 기존 이름과 충돌하지 마십시오.
원하는 유형의 변수 매개 변수를 정의 할 수있는 방법도 없습니다.
스칼라와 같은 일부 언어는 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 기능 인터페이스 최대 2 개의 매개 변수 :
단일 매개 변수 인터페이스
Consumer
Predicate
Function
2 개의 매개 변수 인터페이스
BiConsumer
BiPredicate
BiFunction
둘 이상의 경우 다음과 같은 기능 인터페이스를 작성해야합니다 (소비자 유형).
@FunctionalInterface
public interface FiveParameterConsumer<T, U, V, W, X> {
public void accept(T t, U u, V v, W w, X x);
}
답변
또 다른 대안은 이것이 특정 문제에 적용되는지 확실하지 않지만 일부 UnaryOperator
는 java.util.function 라이브러리에서 사용하는 것 입니다. 여기서 지정한 것과 동일한 유형을 반환하므로 모든 변수를 하나의 클래스에 넣고 매개 변수로 사용합니다.
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
에는 많은 인스턴스 변수가있을 수 있으며 람다 식의 매개 변수를 변경할 필요가 없습니다.
관심있는 사람들을 위해 java.util.function 라이브러리 사용 방법에 대한 메모를 작성했습니다 .http : //sysdotoutdotprint.com/index.php/2017/04/28/java-util-function-library/
답변
또한 jOOL 라이브러리를 사용할 수 있습니다 – https://github.com/jOOQ/jOOL
이미 다른 수의 매개 변수로 기능 인터페이스를 준비했습니다. 예를 들어, org.jooq.lambda.function.Function3
등을 Function0
까지 사용할 수 있습니다 Function16
.