2、JAVA8 之 Optional 线上应用

背景

  接着《1、Optional 应用》的基础,我们直接来看下线上的实际应用。

线上示例

1、案例一:循环内部判空

 原始代码

List<ConstantScoreQueryBuilder> validBuilderList = Lists.newArrayList();

for (ConstantScoreQueryBuilder queryBuilder : nameMtBuilder) {
  if (queryBuilder != null) {
    validBuilderList.add(queryBuilder);
  }
}

for (ConstantScoreQueryBuilder queryBuilder : tagBuilderList) {
  if (queryBuilder != null) {
    validBuilderList.add(queryBuilder);
  }
}

if (categoryBuilder != null) {
  validBuilderList.add(categoryBuilder);
}
if (nerEntityBuilder != null) {
  validBuilderList.add(nerEntityBuilder);
}

 Optional改造代码

List<ConstantScoreQueryBuilder> validBuilderList = Lists.newArrayList();

nameMtBuilder.forEach(nameBuilder -> Optional.ofNullable(nameBuilder).ifPresent(validBuilderList::add));
tagBuilderList.forEach(tagBuilder -> Optional.ofNullable(tagBuilder).ifPresent(validBuilderList::add));
Optional.ofNullable(categoryBuilder).ifPresent(validBuilderList::add);
Optional.ofNullable(nerEntityBuilder).ifPresent(validBuilderList::add);

2、案例二:循环外判空

 原始代码

String query = recallInfoCarrier.getQuery();
String originQuery = recallInfoCarrier.getOriginQuery();
List<String> correctQueryList = recallInfoCarrier.getCorrectQueryList();
List<String> querySynonymsList = recallInfoCarrier.getQuerySynonyms();
List<String> rewriteQueryList = recallInfoCarrier.getQueryRewrites();
Map<String, Double> reorderSearchWords = Maps.newLinkedHashMap();
reorderSearchWords.put(query, 10.0);
reorderSearchWords.put(originQuery, 10.0);

if (CollectionUtils.isNotEmpty(correctQueryList)) {
  for (String correctQuery : correctQueryList) {
    reorderSearchWords.put(correctQuery, 9.0);
  }
}
if (CollectionUtils.isNotEmpty(querySynonymsList)) {
  for (String synonyms : querySynonymsList) {
    reorderSearchWords.put(synonyms, 8.0);
  }
}
if (CollectionUtils.isNotEmpty(rewriteQueryList)) {
  for (String rewrite : rewriteQueryList) {
    reorderSearchWords.put(rewrite, 7.0);
  }
}
for (Map.Entry<String, Double> entry : searchWords.entrySet()) {
  if (reorderSearchWords.get(entry.getKey()) != null) {
    continue;
  }
  reorderSearchWords.put(entry.getKey(), 6.0);
}
recallInfoCarrier.setSearchWords(reorderSearchWords);

 Optional改造代码

Map<String, Double> reorderSearchWords = Maps.newLinkedHashMap();
reorderSearchWords.put(recallInfoCarrier.getQuery(), 10.0);
reorderSearchWords.put(recallInfoCarrier.getOriginQuery(), 10.0);

Optional.ofNullable(recallInfoCarrier.getCorrectQueryList()).orElse(Lists.newArrayList()).forEach(correctQuery -> reorderSearchWords.put(correctQuery, 9.0));
Optional.ofNullable(recallInfoCarrier.getQuerySynonyms()).orElse(Lists.newArrayList()).forEach(synonymsQuery -> reorderSearchWords.put(synonymsQuery, 8.0));
Optional.ofNullable(recallInfoCarrier.getQueryRewrites()).orElse(Lists.newArrayList()).forEach(rewriteQuery -> reorderSearchWords.put(rewriteQuery, 7.0));

searchWords.forEach((kQuery, score) -> reorderSearchWords.putIfAbsent(kQuery, 6.0));

recallInfoCarrier.setSearchWords(reorderSearchWords);

3、案例三:三目运算赋值 

import java.util.Optional;
 
public class Java8Tester {
   public static void main(String args[]){
      Java8Tester java8Tester = new Java8Tester();
      Integer value1 = null;
      Integer value2 = new Integer(10);
        
      // Optional.ofNullable - 允许传递为 null 参数
      Optional<Integer> a = Optional.ofNullable(value1);
        
      // Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
      Optional<Integer> b = Optional.of(value2);
      System.out.println(java8Tester.sum(a,b));
   }
    
   public Integer sum(Optional<Integer> a, Optional<Integer> b){
      // Optional.isPresent - 判断值是否存在
      System.out.println("第一个参数值存在: " + a.isPresent());
      System.out.println("第二个参数值存在: " + b.isPresent());
        
      // Optional.orElse - 如果值存在,返回它,否则返回默认值0
      Integer value1 = a.orElse(new Integer(0));
        
      //Optional.get - 获取值,值需要存在
      Integer value2 = b.get();
      return value1 + value2;
   }
}
原文地址:https://www.cnblogs.com/liang1101/p/14674832.html