찾다

 >  Q&A  >  본문

java集合容器的两个问题

  1. 要从一个List<Person>集合中,找出Person的id为id1的对象,除了遍历有什么更简便的写法?我记得c#中可以直接find,就一行代码?
  2. 想让一个List<Person>集合中,所有元素的id作为一个数组输出如[id1,id2,id3...],除了遍历有什么简便写法?
大家讲道理大家讲道理2803일 전810

모든 응답(6)나는 대답할 것이다

  • 巴扎黑

    巴扎黑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);
        }
    }

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 11:01:30

    很简单, 这里选错了容器类型. 明显应该是Map该干的事情 建立Map id-> Person. 两个问题迎刃而解

    让牛去拉磨, 驴去耕地, 是不对滴

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 11:01:30

    原生的SDK 没有这种方法,都需要自己写。
    但是java存在这么久肯定有相关的库啦,

    比如:
    Apache-Commons-Collections

    회신하다
    0
  • 大家讲道理

    大家讲道理2017-04-17 11:01:30

    原生的API中是没有这些方法的,只能自己写或者是找第三方的库。

    회신하다
    0
  • PHP中文网

    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 的库了。

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-17 11:01:30

    选用Map 需求不同选择的集合类型也不一样 像你这样的情况map最合适。如果要排序就用list

    회신하다
    0
  • 취소회신하다