Trong Java 8, tương đương là các giao diện java.util.function.Function<T, R>
và java.util.function.Consumer<T>
tương ứng. Tương tự, java.util.function.Predicate<T>
tương đương với System.Predicate<T>
. Như đã đề cập ở nơi khác, đây là những giao diện thay vì các đại biểu.
liên quan sang một bên: Tôi hiện đang nghiêng nhiều vào lớp tiện ích sau đây để làm LINQ giống như phương pháp mở rộng thứ:
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;
}
}
Không giống như System.Linq.Enumerable.Where<TSource>
và System.Linq.Enumerable.Select<TSource, TResult>
các phương pháp LINQ-như tôi trình bày ở đây không phải là lười biếng và hoàn toàn duyệt qua các bộ sưu tập nguồn trước khi trả về bộ sưu tập kết quả cho người gọi. Tuy nhiên, tôi thấy chúng hữu ích cho mục đích hoàn toàn cú pháp và có thể được thực hiện lười biếng nếu cần thiết. Với
class Widget {
public String name() { /* ... */ }
}
Người ta có thể làm như sau:
List<Widget> widgets = /* ... */;
Iterable<Widget> filteredWidgets = IterableUtil.where(widgets, w -> w.name().startsWith("some-prefix"));
Mà tôi thích như sau:
List<Widget> widgets = /* ... */;
List<Widget> filteredWidgets = new ArrayList<Widget>();
for (Widget w : widgets) {
if (w.name().startsWith("some-prefix")) {
filteredWidgets.add(w);
}
}
Nguồn
2014-03-31 04:24:28
Xem thêm http://stackoverflow.com/questions/7296606/what-is-the-closes t-thing-java-has-to-net-func-and-action-delegate – nawfal