In Java 8, gli equivalenti sono rispettivamente le interfacce java.util.function.Function<T, R>
e java.util.function.Consumer<T>
. Allo stesso modo, java.util.function.Predicate<T>
equivale a System.Predicate<T>
. Come accennato altrove, queste sono interfacce invece di delegati.
Related parte: Attualmente sto appoggiato pesantemente sul seguente classe di utilità per fare LINQ come metodo di estensione roba:
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;
}
}
differenza System.Linq.Enumerable.Where<TSource>
e System.Linq.Enumerable.Select<TSource, TResult>
metodi LINQ-like che presento qui non sono pigri e attraversare completamente le raccolte di origine prima di restituire le raccolte di risultati al chiamante. Tuttavia, li trovo utili a fini puramente sintattici e potrebbero essere resi pigri se necessario. Dato
class Widget {
public String name() { /* ... */ }
}
si può fare quanto segue:
List<Widget> widgets = /* ... */;
Iterable<Widget> filteredWidgets = IterableUtil.where(widgets, w -> w.name().startsWith("some-prefix"));
che io preferisco il seguente:
List<Widget> widgets = /* ... */;
List<Widget> filteredWidgets = new ArrayList<Widget>();
for (Widget w : widgets) {
if (w.name().startsWith("some-prefix")) {
filteredWidgets.add(w);
}
}
fonte
2014-03-31 04:24:28
Vedi anche http://stackoverflow.com/questions/7296606/che cosa-è-la-close t-cosa-java-ha-to-the-net-func-e-azione-delegati – nawfal