Java의 동등한 Func 및 Action
내 말은, 내가 직접 쓰는 게 아니라
public interface Func<TInput, TResult>
{
TResult call(TInput target) throws Exception;
}
public interface Action<T>
{
void call(T target) throws Exception;
}
Java 8 에서는, 각각 및 인터페이스가 등가입니다.마찬가지로, 는 다음과 같습니다.System.Predicate<T>
다른 곳에서 언급했듯이 이들은 대리인이 아닌 인터페이스입니다.
관련 항목 제외:저는 현재 LINQ와 같은 확장 메서드 작업을 하기 위해 다음 유틸리티 클래스에 크게 의존하고 있습니다.
abstract class IterableUtil {
public static <T> Iterable<T> where(Iterable<T> items, Predicate<T> predicate) {
ArrayList<T> result = new ArrayList<T>();
for (T item : items) {
if (predicate.test(item)) {
result.add(item);
}
}
return result;
}
public static <T, R> Iterable<R> select(Iterable<T> items, Function<T, R> func) {
ArrayList<R> result = new ArrayList<R>();
for (T item : items) {
result.add(func.apply(item));
}
return result;
}
}
★★★★★★★★★★★★★★★와 달리System.Linq.Enumerable.Where<TSource>
★★★★★★★★★★★★★★★★★」System.Linq.Enumerable.Select<TSource, TResult>
여기서 설명하는 LINQ와 같은 메서드는 게으르지 않고 결과 컬렉션을 호출자에게 반환하기 전에 소스 컬렉션을 완전히 통과합니다.그래도, 나는 그것들이 순전히 통사적인 목적으로 유용하고 필요하다면 게으름을 피울 수 있다고 생각한다. ★★★★★★★★★★★★★★★★★」
class Widget {
public String name() { /* ... */ }
}
다음을 수행할 수 있습니다.
List<Widget> widgets = /* ... */;
Iterable<Widget> filteredWidgets = IterableUtil.where(widgets, w -> w.name().startsWith("some-prefix"));
다음 중 하나를 더 선호합니다.
List<Widget> widgets = /* ... */;
List<Widget> filteredWidgets = new ArrayList<Widget>();
for (Widget w : widgets) {
if (w.name().startsWith("some-prefix")) {
filteredWidgets.add(w);
}
}
콜 가능 인터페이스는 Func와 비슷합니다.
실행 가능한 인터페이스는 액션과 유사합니다.
일반적으로 Java는 C# 위임 대신 익명 내부 클래스를 사용합니다.예를 들어 GUI에서 버튼 누름에 반응하는 코드를 추가하는 방법은 다음과 같습니다.
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
...//code that reacts to the action...
}
});
위임의 문제 은0의 인수Func는 0~16개의 인수)를입니다.Func<TResult>
,Func<T, TResult>
,Func<T1, T2, TResult>
의 개요)
유감스럽게도 자바에서는 타입 삭제로 인해 불가능합니다.클래스는 일반 유형 매개 변수만으로 다를 수 없습니다.
은 이제 Java 8과 같은 했습니다.BiConsumer
★★★★★★에Action<T, T2>
인수를 하지 않기 에 primitive type은 primitive type입니다.BiIntConsumer
그러나 "zoo"는 그다지 크지 않기 때문에 그것을 확장하는 라이브러리는 잘 모릅니다.''이라는 훌륭한 .(int, int) => void
채택되지 않았습니다.
★★★의 Func<T>
use: java.disc.function.공급업체 http://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html
java.util을 사용할 수 있습니다.다음과 같은 기능
Function<Employee, String> f0 = (e) -> e.toString();
단, 복수의 인수(C#Func와 같이)와 함께 사용하는 경우에는 기능 버전을 정의해야 합니다.다음과 같은 인터페이스
@FunctionalInterface
public interface Func2Args<T, T1, R> {
R apply(T t, T1 t1);
}
@FunctionalInterface
public interface Func3Args<T,T1,T2,R> {
R apply(T t, T1 t1, T2 t2);
}
그러면 변수 no of 인수와 함께 사용할 수 있습니다.
Func2Args<Employee,Employee,String> f2 = (e, e2) -> e.toString() +
e2.toString();
Func3Args<Employee,Employee,Employee,String> f3 = (e, e2, e3) ->
e.toString() + e2.toString() + e3.toString();
그것들에 상응하는 것은 정말 없다.Java에서 익명 내부 클래스를 만들 수 있지만 Func나 Action과 같은 일반적인 인터페이스가 아닌 특정 인터페이스가 있는 경향이 있습니다.
Java에는 대표라는 개념이 없습니다.회피책의 어프로치에 대해서는, Java 프로그래머가 C#의 대리인을 조사하다를 참조해 주세요.
C#에는 Java와 유사한 기능이 있지만 몇 가지 새롭고 흥미로운 기능이 추가되었습니다.위임은 메서드를 1등급 개체로 취급하는 기능입니다.C# 대리인은 Java 개발자가 단일 메서드로 인터페이스를 사용하는 경우에 사용됩니다.이 문서에서는 C#에서의 위임 사용에 대해 설명하고 동일한 기능을 수행할 수 있는 Java 위임 개체의 코드를 보여 줍니다.여기서 소스 코드를 다운로드합니다.
Java 8보다 오래된 버전의 경우
C#의 메서드콜백에 대해서는 다음과 같이 사용합니다.
public void MyMethod(string par1, string par2, Action<int> callback, Action<int, string> callback2)
{
//Async Code
callback.invoke(1);
callback2.invoke(4, "str");
}
그리고 그것을 부른다:
utils.MyMethod("par1", "par2", (i) =>
{
//cb result
}, (i, str) =>
{
//cb2 result
});
나는 자바에서 작은 추상 수업을 만들었다.
package com.example.app.callbacks;
public abstract class Callback1<T> {
public void invoke(T obj) {}
}
package com.example.app.callbacks;
public abstract class Callback2<T, T2> {
public void invoke(T obj, T2 obj2) {}
}
package com.example.app.callbacks;
public abstract class Callback3<T, T2, T3> {
public void invoke(T obj, T2 obj2, T3 obj3) {}
}
...ETC
Java 메서드는 다음과 같습니다.
public void myMethod(String par1, String par2, final Callback1<int> callback, final Callback2<int, String> callback2) {
//Async Code
callback.invoke(1);
callback2.invoke(4, "str");
}
이제 Java로 호출할 때:
utils.myMethod("par1", "par2", new Callback<int>() {
@Override
public void invoke(int obj) {
super.invoke(obj);
//cb result
}
}, new Callback2<int, String>() {
@Override
public void invoke(int obj, String obj2) {
super.invoke(obj, obj2);
//cb2 result
}
});
이것은, 콜 하는 클래스에 콜백을 건네거나 설정하는 것으로도 기능합니다.인터페이스를 작성하는데도 같은 방법을 사용할 수 있습니다.
package com.example.app.interfaces;
public interface MyInterface<T> {
void makeDo(T obj);
void makeAnotherDo();
}
Java 8 이후 Functional Interface와 Lambda Expression을 통해 Func 및 Action을 달성할 수 있습니다.
Functional Interface는 추상적인 메서드가1개밖에 없는 인터페이스입니다
@FunctionalInterface
interface Drawable {
void Draw();
}
@FunctionalInterface
attribute는 옵션입니다.한편, Lambda Expression의 개념은 C#과 Java에서 동일합니다.
다음 Java 코드와 C# 코드는 동일합니다.
class App
{
public static void Main(string[] args)
{
Action action = () => { Console.WriteLine("Printing from App class"); };
action();
}
}
@FunctionalInterface
interface Drawable {
void Draw();
}
public class App {
public static void main(String[] args) throws Exception {
Drawable drawable = ()->System.out.println("Printing from App class");
drawable.Draw();
}
}
Java에서는 Func 및 Action이 Functional Interface로 대체됩니다.
이런 종류의 인터페이스를 사용하면 Java는 특별히 Func와 Action을 만족시키는 인터페이스를 만들 수 있기 때문에 Func와 Action의 위임 유형을 가질 필요가 없습니다(파라미터와 반환 유형이 됩니다).따라서 Java의 코드는 C# 버전보다 조금 더 상세합니다.
(이것은, https://www.byteinthesky.com/tutorials/func-and-action-equivalent-in-java/) 에서 정리한 것입니다.
(저와 같은) C# 배경에서 다음 사항을 찾고 있는 경우:
public delegate TResult Func<in T1,in T2,out TResult>(T1 arg1, T2 arg2);
다음 항목을 참조하십시오.
public interface BiFunction<T, U, R>
이것은 실천이 부족한 나의 실장입니다<T...> 복수의 파라미터 타입의 범용 인터페이스.
package x.y.delegate;
public class IAction {
public interface _0 { void execute(); }
public interface _1<T> { void execute(T p); }
public interface _2<T1, T2> { void execute(T1 p1, T2 p2); }
public interface _3<T1, T2, T3> { void execute(T1 p1, T2 p2, T3 p3); }
public interface _4<T1, T2, T3, T4> { void execute(T1 p1, T2 p2, T3 p3, T4 p4); }
public interface _5<T1, T2, T3, T4, T5> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5); }
public interface _6<T1, T2, T3, T4, T5, T6> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6); }
public interface _7<T1, T2, T3, T4, T5, T6, T7> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7); }
public interface _8<T1, T2, T3, T4, T5, T6, T7, T8> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8); }
public interface _9<T1, T2, T3, T4, T5, T6, T7, T8, T9> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9); }
public interface _10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9, T10 p10); }
public interface _11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9, T10 p10, T11 p11); }
public interface _12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9, T10 p10, T11 p11, T12 p12); }
public interface _13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9, T10 p10, T11 p11, T12 p12, T13 p13); }
public interface _14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9, T10 p10, T11 p11, T12 p12, T13 p13, T14 p14); }
public interface _15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9, T10 p10, T11 p11, T12 p12, T13 p13, T14 p14, T15 p15); }
public interface _16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> { void execute(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9, T10 p10, T11 p11, T12 p12, T13 p13, T14 p14, T15 p15, T16 p16); }
}
class DoSomething {
public void doSm(IAction._1 ack, IAction._2 ack2) {
}
}
https://github.com/ThinhVu/javaext 또는 https://jitpack.io/ #ThinhVu/javaext/1.0.0 링크에 Action, Func, Predicate 및 Tuple 정의가 포함된 lib가 있습니다.
언급URL : https://stackoverflow.com/questions/1184418/javas-equivalents-of-func-and-action
'source' 카테고리의 다른 글
'==' 또는 'is'를 사용하여 문자열을 비교하면 결과가 달라질 수 있는 이유는 무엇입니까? (0) | 2022.11.15 |
---|---|
정수 해시 키를 사용할 수 있는 정수 해시 함수는 무엇입니까? (0) | 2022.11.15 |
VueJ의 1개의 컴포넌트에서 모든 이벤트를 어떻게 듣습니까? (0) | 2022.11.15 |
java.exe와 javaw의 차이.실행 (0) | 2022.11.15 |
쿼리 문자열을 배열로 구문 분석 (0) | 2022.11.15 |