Java8 Stream 各种常见流处理功能

  • List 根据某些属性进行去重
List<Order> orders = Lists.newArrayList();
// 按照订单编号和类型去重
orders = orders.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()
          -> new TreeSet<>(Comparator.comparing(o -> o.getNum() + ";" + o.getType()))), ArrayList::new));
  • List根据属性进行过滤
List<String> haveList = orders.stream().filter(o -> (o.getId.equals("sds"))).collect(Collectors.toList());
  • List 提取某一属性,转换成对应的List
// 提取order的idList
List<String> orderIds = orders.stream().map(Order::getId).collect(Collectors.toList());
  • 获取List 中时间字段最小的时间
List<TimeModel> targetTimes = targetService.getTodayTimeModelList();
Optional<LocalDateTime> optionalMinTime = targetTimes.stream().min(Comparator.comparing(TimeModel::getDateTime)).map(TimeModel::getDateTime);
LocalDateTime minTime = optionalMinTime.get();
  • List 根据id,转换成map(分组)
//根据岗位Id,划分为map<postId,  List<PersonPostModelVO>>
Map<String, List<PersonVO>> groupingMap = PersonList.stream().collect(Collectors.groupingBy(PersonVO::getPostId));
  • 根据id,找到List对应的对象的下标(找不到返回-1)
int index = IntStream.range(0, orderList.size())
                    .filter(i -> entry.getKey().equals(orderList.get(i).getId()))
                    .findFirst().orElse(-1);
  • 两List集合求差集
//new - old
List<SysPerson> addNormalList = newPersonList.stream()
                    .filter(w -> !oldPersonList.stream().map(SysPerson::getId).collect(Collectors.toList()).contains(w.getId()))
                    .collect(Collectors.toList());
  • 实现多字段依次排序
//先age升序,再id降序
personList.stream().sorted(
Comparator.comparing(Person::getAge).thenComparing(-Person::getId)
).collect(Collectors.toList()) 

//先id升序,再时间降序
personList = personList.stream()
    .sorted(Comparator.comparing(Person::getId)
        .thenComparing(wl -> -wl.getCreatedTime().getTime())
    )
    .collect(Collectors.toList());

//上面的负号可能会报错,还可以采用下面方式,调用reversed方法
//code升序,id降序
Collections.sort(personList, Comparator.comparing(Person::getCode)
.thenComparing(Comparator.comparing(Person::getId).reversed()))
  • 排序时传入自定义排序方法
//排下序(先按照状态排序,再按照修改时间排序)
result = result.stream().sorted(Comparator.comparing(BillHeaderVO::getStatus, (o1, o2)->{
           …… }).thenComparing(BillHeaderVO::getDatetimeModified).reversed()).collect(Collectors.toList());
  • String[] 转 List<Integer>
List<Integer> list = Arrays.asList(text.split(",")).stream()
                .map(s -> Integer.parseInt(s))  //.map(Integer::valueOf)
                .collect(Collectors.toList());
  • List<对象> 转 Map
// 给出key重复时,使用哪个key作为主键,以下代码中的(oldKey, newKey) -> oldKey)代表oldKey和newKey键重复时返回oldKey对应的User
Map<Long, User> map = list.stream().collect(Collectors.toMap(User::getId, Function.identity(), (k1, k2) -> k1));

// 只返回对象里某个属性作为Value
Map<Long, String> map = list.stream().collect(Collectors.toMap(User::getId, User::getAge, (k1, k2) -> k1));
  • 汇总
// BigDecimal
BigDecimal sum = list.stream().map(Order::getCost).reduce(BigDecimal.ZERO, BigDecimal::add);
// int、double、long等基础类型
Double sum = list.stream().mapToDouble(Student::getScore).sum();

欢迎补充和指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 8中的Stream API支持通过`flatMap`方法来实现的复合操作。这个方法可以将一个中的每个元素转换成另一个,然后将这些合并成一个。在此基础上,可以进行更多的中间操作和终端操作。 下面是一个示例代码,演示了如何使用Stream的复合: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamDemo { public static void main(String[] args) { List<String> words = Arrays.asList("hello", "world", "java"); List<String> letters = words.stream() .flatMap(word -> Arrays.stream(word.split(""))) .distinct() .sorted() .collect(Collectors.toList()); System.out.println(letters); } } ``` 在这个示例代码中,我们首先定义了一个字符串列表`words`。接着,我们使用`flatMap`方法将这个列表中的每个字符串都转换成一个字符,并将这些字符合并成一个。然后,我们对这个进行了去重、排序等操作,并将结果收集到了一个新的列表中。 运行这段代码,输出结果为: ``` [a, d, e, h, j, l, o, r, w] ``` 这个结果是将原来列表中的所有字符去重、排序后得到的结果。 需要注意的是,`flatMap`方法返回的是一个新的,因此可以继续进行后续的操作。同时,由于`flatMap`方法需要将一个元素转换成一个,因此需要传入一个函数作为参数。这个函数的返回值必须是一个。 ### 回答2: Java 8引入了Stream API,使得我们可以更方便地对集合和数组进行处理和操作。Stream API提供了一种式操作的方式,可以实现数据的筛选、转换、排序等功能Java 8中的Stream API支持通过多种方式创建,如通过集合对象的stream()方法、Arrays类的stream()方法、Stream类的of()方法等。在创建了之后,我们可以通过一系列的中间操作和终端操作对进行操作。 复合是指通过多个操作的组合来实现更复杂的操作。Java 8中可以使用多个中间操作来构建一个水线操作。例如,我们可以先对数据进行筛选,然后对筛选后的数据进行映射处理,接着再进行排序等。这种操作可以通过链式调用来实现,每个中间操作都返回一个新的对象,可以继续对其进行下一步操作。 常见的中间操作有filter、map、flatMap、distinct等,用于对中的元素进行过滤、映射、扁平化等操作。而终端操作主要用于触发的执行,如forEach、collect、reduce等,用于获取中的结果或将结果收集到一个集合中。 通过复合的使用,我们可以更简洁地实现复杂的数据操作,减少了对临时变量和循环的依赖,使得代码更易读、更易维护。但需要注意的是,是一次性的,即一旦对进行了终端操作,就不可再对其进行其他操作。因此,在使用操作时要谨慎选择合适的中间和终端操作,以避免产生不必要的计算。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值