java函数式编程之Stream

filter()

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

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

测试代码:

private List<User>userList = new ArrayList<>();
@Before
public 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));
}

@Test
public 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);

测试代码:

@Test
public 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);

测试代码:

@Test
public 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);

测试代码:

@Before
public 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));
}
@Test
public 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);

测试代码:

@Test
public 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();

测试代码:

@Test
public  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();

测试代码:

@Test
public  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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值