java函数式编程之Stream

来源:互联网 发布:js 数组元素 函数 编辑:程序博客网 时间:2024/06/05 18:35

filter()

描述:对集合进行过滤,返回一个符合特定条件的Stream。
源码:

Stream<T> filter(Predicate<? super T> predicate);

测试代码:

private List<User>userList = new ArrayList<>();@Beforepublic void init(){    userList.add(new User("zm",28, User.SexEnum.MALE));    userList.add(new User("zm1",38, User.SexEnum.FAMALE));    userList.add(new User("zm2",48, User.SexEnum.MALE));}@Testpublic void testFilter(){    //筛选出性别不为FAMALE的    Streamstream = userList.stream().filter(user -> user.getSex()!= User.SexEnum.FAMALE);    logger.info(stream.collect(Collectors.toList()).toString());}

测试结果:

[User{name='zm', age=28, sex=MALE}, User{name='zm2', age=48, sex=MALE}]

map()

描述:根据当前集合经过处理,得到一个包含目标类型Stream。
源码:

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

测试代码:

@Testpublic void testMap(){    Stream<String> stream = userList.stream().map(user -> user.getName());    logger.info(stream.collect(toList()).toString());}

用上面的用户列表,经过处理得到一个含用户名的Stream。
测试结果如下:

[zm, zm1, zm2]

mapToInt()

描述:根据一个集合,经过处理得到一个整数的IntStream。
源码:

IntStream mapToInt(ToIntFunction<? super T> mapper);

测试代码:

@Testpublic void testMapToInt(){    //得到含用户年龄的IntStream    IntStream intStream = userList.stream().mapToInt(user -> user.getAge());    int[] ary = intStream.toArray();    logger.info(Arrays.toString(ary));}

测试结果:

[28, 38, 48]

mapToLong()

描述:参考mapToInt()


mapToDouble()

描述:参考mapToInt()


flatMap()

描述:取出集合里面包含的集合属性的集合的Stream。如:List< User>是源集合,每个User包含一个List< Car>集合, 此方法能取出每个User里面的carList组合到一起,返回一个Stream。更直观的参见测试代码。
源码:

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

测试代码:

@Beforepublic void init(){    List<Car>carList = Arrays.asList(new Car("X1","BMW"),new Car("Q3","AUDI"));    userList.add(new User("zm",28, User.SexEnum.MALE,carList));    userList.add(new User("zm1",38, User.SexEnum.FAMALE,carList));    userList.add(new User("zm2",48, User.SexEnum.MALE,carList));}@Testpublic void testFlatMap(){    Stream<Car> stream = userList.stream().flatMap(user -> user.getCarList().stream());    List<Car>carList = stream.collect(toList());    logger.info(carList.toString());}

测试结果:

[Car{name='X1', type='BMW'}, Car{name='Q3', type='AUDI'}, Car{name='X1', type='BMW'}, Car{name='Q3', type='AUDI'}, Car{name='X1', type='BMW'}, Car{name='Q3', type='AUDI'}]

flatMapToInt()

描述:根据源Stream返回一个IntStream
源码:

IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);

测试代码:

@Testpublic void testFlatMapToInt(){    userList.forEach(user -> {        user.setIntegerList(Arrays.asList(1,2,3));    });    IntStream intStream = userList.stream().flatMapToInt(user -> IntStream.of(user.getAge()));    intStream.forEach(age ->{          logger.info(age+"");    });}

测试结果:

一月 07, 2017 10:22:58 下午 com.zm.demo.StreamTest lambda$testFlatMapToInt$6信息: 28一月 07, 2017 10:22:58 下午 com.zm.demo.StreamTest lambda$testFlatMapToInt$6信息: 38一月 07, 2017 10:22:58 下午 com.zm.demo.StreamTest lambda$testFlatMapToInt$6信息: 48

flatMapToLong()

描述:参考flatMapToInt()


flatMapToDouble()

描述:参考flatMapToInt()


distinct()

描述:去除重复的元素
源码:

Stream<T> distinct();

测试代码:

@Testpublic  void testDistinct(){    List<Integer> list = Stream.of(1,5,3,2,1,5,3,4).distinct().collect(Collectors.toList());    logger.info(list.toString());}

测试结果:

[1, 5, 3, 2, 4]

sorted()

描述:按自然顺序排序
源码:

Stream<T> sorted();

测试代码:

@Testpublic  void testSorted(){    List<Integer> list = Stream.of(1,5,3,2,1,5,3,4).sorted().collect(Collectors.toList());    logger.info(list.toString());}

测试结果:

[1, 1, 2, 3, 3, 4, 5, 5]

待续。。。

0 0
原创粉丝点击