Maison > Questions et réponses > le corps du texte
巴扎黑2017-04-17 11:01:30
可能不太简洁,但是可以自己写:
import java.util.Arrays; import java.util.Iterator; import java.util.List; public final class ListUtils { public static <T> T collectFirst(final Iterable<T> list, final Predicate<T> predicate) { for (T element : list) { if (predicate.apply(element)) { return element; } } return null; } public static <A, B> Iterable<B> map(final Iterable<A> list, final F1<A, B> func) { return new Iterable<B>() { @Override public Iterator<B> iterator() { return new Iterator<B>() { private Iterator<A> i = list.iterator(); @Override public boolean hasNext() { return i.hasNext(); } @Override public B next() { return func.apply(i.next()); } @Override public void remove() { i.next(); } }; } }; } public static void main(String[] args) { final List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6); final Integer result = collectFirst(integers, new Predicate<Integer>() { @Override public boolean apply(Integer e) { return e.compareTo(3) > 0; } }); System.out.println(String.format("The first integer larger than 3 is %d", result)); final Iterable<Integer> results = map(integers, new F1<Integer, Integer>() { @Override public Integer apply(Integer integer) { return integer * integer; } }); System.out.println("The squares of them are: "); for (Integer i : results) { System.out.print(i + " "); } } public interface Predicate<T> { boolean apply(final T e); } public interface F1<A, B> { B apply(final A a); } }
黄舟2017-04-17 11:01:30
很简单, 这里选错了容器类型. 明显应该是Map该干的事情 建立Map id-> Person. 两个问题迎刃而解
让牛去拉磨, 驴去耕地, 是不对滴
黄舟2017-04-17 11:01:30
原生的SDK 没有这种方法,都需要自己写。
但是java存在这么久肯定有相关的库啦,
比如:
Apache-Commons-Collections
PHP中文网2017-04-17 11:01:30
一句话:目前的 Java 不能很好地支持这种函数式风格的集合操作。等 Java 8 的 lambda 出来之后可能会好些。
如果 lz 一定要用:
之前找到过一个库: http://code.google.com/p/lambdaj/ 代码写出来大概是这样子的:
List<Person> p1 = filter(having(on(Person.class).getId(), equalsTo(1)), list);
算是我找到的写出来的代码最像 LINQ 的库了。