• Java 一些异常报错、注意事项(4) - Java8


    记录一:Java8 stream peek使用

    Stream peek(Consumer action), 是针对流中的每个元素执行操作action,通常用于查阅中间流结果。它能够将中间变量的值输出到日志,帮助了解流水线的每一步操作的输出值。

    注意点:(1)使用peek操作流,流中的元素没有改变。

    (2)peek对一个对象进行操作的时候,对象不变,但是可以改变对象里面的值。

    当看到第(1)点时,会觉得peek只是用于debug查看流水线输出情况的,但是可以利用第(2)点对数据做一些处理。

    例如:

    1. public class Test {
    2. public static void main(String[] args) {
    3. List collect = Arrays.asList(new Person("001", "ms"), new Person("002", "ls"))
    4. .stream().filter(p -> "ls".equals(p.getName())).peek(p -> p.setId("000")).collect(Collectors.toList());
    5. collect.forEach(c-> System.out.println(c));
    6. }
    7. }
    8. @AllArgsConstructor
    9. @Data
    10. public class Person {
    11. private String id;
    12. private String name;
    13. }

    记录二:@ConditionalOnBea注解使用

    当容器中存在某类型的Bean时才注入容器,否则不注入容器。

    如果是结合多个Bean判断,示例:

    1. @Bean
    2. @ConditionalOnBean(value = {Notifier.class,AsyncEventBus.class})
    3. public UserEventBus userEventBus(Map notifiers,Map eventBus) {
    4. return new UserEventBus(Collections.singletonList(notifiers.values()),Collections.singletonList(eventBus.values()));
    5. }

    记录三:Java8 Optional中orElse和orElseGet使用

    1. //当Optonal为空时,orElse、orElseGet都会执行
    2. //当Optional有值时,orElse会执行,而orElseGet不会执行
    3. Optional.of("Tag").orElse(getNewTag());
    4. Optional.of("Tag").orElseGet(() -> getNewTag());
    5. public static String getNewTag() {
    6. return "Tag1";
    7. }

    记录四:Java8 steam map转换空指针异常

    1. @AllArgsConstructor
    2. @Data
    3. public class Person {
    4. private String name;
    5. private String phone;
    6. }
    7. List personList =new ArrayList<>();
    8. personList.add(new Person("aaa","1111"));
    9. //属性赋了空值
    10. personList.add(new Person("bbb",null));
    11. Map collect1 = personList.stream().collect(Collectors.toMap(Person::getName, Person::getPhone));
    12. System.out.println(collect1);
    13. /*
    14. Exception in thread "main" java.lang.NullPointerException
    15. at java.util.HashMap.merge(HashMap.java:1225)
    16. at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
    17. at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
    18. at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
    19. at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
    20. at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
    21. at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    22. at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    23. at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    24. at .Test.main(Test.java:15)
    25. */
    26. // 这样的转换不会报错
    27. HashMap collect2 = personList.stream().collect(HashMap::new, (newMap, entity) -> newMap.put(entity.getName(), entity.getPhone()), HashMap::putAll);
    28. System.out.println(collect2);

    记录五:stream 多字段排序thenComparing示例

    1. List fieldList=new ArrayList<>();
    2. fieldList.add(new FieldInfo("a2", "type", true,false));
    3. fieldList.add(new FieldInfo("a7", "type", false,false));
    4. fieldList.add(new FieldInfo("a6", "type", true,false));
    5. fieldList.add(new FieldInfo("a4", "type", false,false));
    6. fieldList.add(new FieldInfo("a5", "type", true,false));
    7. fieldList.add(new FieldInfo("a10", "type", false,false));
    8. List sortFields=fieldList.stream().sorted(Comparator.comparing(FieldInfo::isValid).reversed().thenComparing(FieldInfo::getName)).collect(Collectors.toList());

  • 相关阅读:
    【LeetCode题目详解】第九章 动态规划part08 139.单词拆分 (day46补)
    集群&分布式&节点
    【CSS 画个梯形】
    Spring-Kafka系列(3)—— SpringKafka消费者监听MessageListener
    【算法与数据结构】617、LeetCode合并二叉树
    嵌入式分享合集106
    【算能】se5盒子更改root权限
    面试官问:如何优化高并发相关的业务,你能回答的上来吗?
    ts重点学习110-枚举类型的兼容性笔记
    Bootloader概述和Uboot
  • 原文地址:https://blog.csdn.net/MTonj/article/details/125837490