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

记录一:Java8 stream peek使用

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

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

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

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

例如:

public class Test {
    public static void main(String[] args) {

        List<Person> collect = Arrays.asList(new Person("001", "ms"), new Person("002", "ls"))
                .stream().filter(p -> "ls".equals(p.getName())).peek(p -> p.setId("000")).collect(Collectors.toList());
        collect.forEach(c-> System.out.println(c));
    }
}

@AllArgsConstructor
@Data
public class Person {
   private String id;
   private String name;
}

记录二:@ConditionalOnBea注解使用

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

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

	@Bean
    @ConditionalOnBean(value = {Notifier.class,AsyncEventBus.class})
    public UserEventBus userEventBus(Map<String, Notifier> notifiers,Map<String, AsyncEventBus> eventBus) {
       
        return new UserEventBus(Collections.singletonList(notifiers.values()),Collections.singletonList(eventBus.values()));
    }

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

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

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

@AllArgsConstructor
@Data
public class Person {
    private String name;
    private String phone;
}


List<Person> personList =new ArrayList<>();
personList.add(new Person("aaa","1111"));
//属性赋了空值
personList.add(new Person("bbb",null));

Map<String, String> collect1 = personList.stream().collect(Collectors.toMap(Person::getName, Person::getPhone));
System.out.println(collect1);


/*
Exception in thread "main" java.lang.NullPointerException
  at java.util.HashMap.merge(HashMap.java:1225)
  at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
  at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
  at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
  at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
  at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
  at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
  at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
  at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
  at .Test.main(Test.java:15)  

*/

// 这样的转换不会报错
HashMap collect2 = personList.stream().collect(HashMap::new, (newMap, entity) -> newMap.put(entity.getName(), entity.getPhone()), HashMap::putAll);
System.out.println(collect2);    

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值