new definicion java

definicion - text field java



Los equivalentes de Java de Func y Acción (6)

¿Cuáles son los equivalentes de Java de Func y Action ?

Es decir, en lugar de escribir esto solo:

public interface Func<TInput, TResult> { TResult call(TInput target) throws Exception; } public interface Action<T> { void call(T target) throws Exception; }


En Java 8, los equivalentes son las interfaces java.util.function.Function<T, R> y java.util.function.Consumer<T> , respectivamente. Del mismo modo, java.util.function.Predicate<T> es equivalente a System.Predicate<T> . Como se mencionó en otra parte, estas son interfaces en lugar de delegados.

Relacionado a un lado: actualmente me estoy basando en gran medida en la siguiente clase de utilidad para hacer cosas de método de extensión 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; } }

A diferencia de System.Linq.Enumerable.Where<TSource> y System.Linq.Enumerable.Select<TSource, TResult> los métodos LINQ que presento aquí no son flojos y atraviesan completamente las colecciones de origen antes de devolver las colecciones de resultados a la persona que llama. Aún así, los encuentro útiles con fines puramente sintácticos y podrían ser flojos si fuera necesario. Dado

class Widget { public String name() { /* ... */ } }

Uno puede hacer lo siguiente:

List<Widget> widgets = /* ... */; Iterable<Widget> filteredWidgets = IterableUtil.where(widgets, w -> w.name().startsWith("some-prefix"));

Lo cual prefiero a lo siguiente:

List<Widget> widgets = /* ... */; List<Widget> filteredWidgets = new ArrayList<Widget>(); for (Widget w : widgets) { if (w.name().startsWith("some-prefix")) { filteredWidgets.add(w); } }


Java no tiene el concepto de delegados. Para un enfoque de solución alternativa, consulte Un programador de Java examina los delegados de C # :

Si bien C # tiene un conjunto de capacidades similares a Java, ha agregado varias características nuevas e interesantes. La delegación es la capacidad de tratar un método como un objeto de primera clase. El delegado de AC # se usa cuando los desarrolladores de Java usarían una interfaz con un único método. En este artículo, se discute el uso de delegados en C # y se presenta un código para un objeto delegado de Java que puede realizar una función similar. Descargue el código fuente aquí.


La elegancia de los delegados de Func sobrecargados (además del problema de clase delegado frente a anónimo) es que admiten de 0 a 16 argumentos ( Func<TResult> , Func<T, TResult> , Func<T1, T2, TResult> , etc.)

Desafortunadamente, esto es imposible en Java debido a la borradura de tipo. Las clases no pueden diferir solo por los parámetros de tipo genérico.

Java 8 ahora trae un zoológico de nombres como BiConsumer para Action<T, T2> y, como Java no permite argumentos de tipo primitivo, BiIntConsumer . El "zoológico", sin embargo, no es muy grande, y no conozco una biblioteca que lo expanda. Hubo una propuesta maravillosa para literales de tipo de función como (int, int) => void pero no fue adoptado.



Realmente no hay equivalentes para aquellos. Puede crear clases internas anónimas en Java, pero tiende a haber interfaces específicas en lugar de genéricas como Func y Action.


Callable interfaz Callable es similar a Func.

Runnable interfaz Runnable es similar a Action.

En general, Java usa clases internas anónimas como reemplazo para los delegados de C #. Por ejemplo, así es como se agrega el código para reaccionar al presionar un botón en la GUI:

button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ...//code that reacts to the action... } });