最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java Streams 中的異常處理

 更新時間:2019年03月22日 14:11:44   作者:Go Big Or Go Home  
這篇文章主要介紹了Java Streams 中的異常處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言:

Stream API 和 Lambda 是Java8的重要特性讓我們可以使用更具功能性的語法風格。但是在編寫的代碼時候一個更大的問題是如何處理lambda中的已檢查異常。

但是不能直接調用從Lambda拋出異常!但是可以在Lambda中做一個簡單的try-catch并將異常包裝成一個RuntimeException。

/**###很顯然這不是一種好的表現(xiàn)方式##**/ 
  /**
   * dosomething
   * @param item
   * @return
   */
  private static Object doSomething(String item) {
    System.out.println("doSomething:\t" + item);
    return item;
  }
 
  public static void main(String[] args) {
    List<String> myList = Arrays.asList("1", "2", "3", "4", "5", "6");
 
    myList.stream().map(item -> {
      try {
        return doSomething(item);
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }).forEach(System.out::println);
  }

換一種可讀性比較好的方式呢?

/**將函數(shù)體提取到一個單獨的方法中,并調用新方法做try-catch處理**/  
 private Object doSomething(String item) {
    System.out.println("doSomething:\t" + item);
    return item;
  }
 
  private Object trySomething(String item) {
    try {
      return doSomething(item);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
 
  public void map() {
    List<String> myList = Arrays.asList("1", "2", "3", "4", "5", "6");
    myList.stream().map(this::doSomething).forEach(System.out::println);
  }

RuntimeException

在許多情況下對于一些運行時異常的捕捉都使用 RuntimeException 也可以在lambda內部調用。如果每個調用都進行運行時異常的捕獲,重復代碼就出現(xiàn)了。所以:將它抽象為實用函數(shù),每次需要的時候調用它!

//定義一個檢查接口
@FunctionalInterface
public interface CheckedFunction<T,R> {
  R apply(T t) throws Exception;
}

 您可以在此抽象接口中處理try-catch并將原始異常包裝到 RuntimeException 中。

public static <T,R> Function<T,R> wrap(CheckedFunction<T,R> checkedFunction) {
 return t -> {
  try {
   return checkedFunction.apply(t);
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
 };
}

/**調用公共wrap 進行異常處理*/
public void map(){
    List<String> myList = Arrays.asList("1", "2", "3", "4", "5", "6");
    myList.stream()
      .map(wrap(item -> doSomething(item)))
      .forEach(System.out::println);
}

Either

使用流時如果發(fā)生異常不希望停止處理流,Either類型是函數(shù)式語言中的常見類型而不是Java的一部分。與Java中的Optional類型類似,Either是具有兩種可能性的通用包裝器。例如,如果我們有一個Either值,那么這個值可以包含String類型或Integer類型Either<String,Integer>。

public class Either<L, R> {
  private final L left;
  private final R right;
  private Either(L left, R right) {
    this.left = left;
    this.right = right;
  }
  public static <L,R> Either<L,R> Left( L value) {
    return new Either(value, null);
  }
  public static <L,R> Either<L,R> Right( R value) {
    return new Either(null, value);
  }
  public Optional<L> getLeft() {
    return Optional.ofNullable(left);
  }
  public Optional<R> getRight() {
    return Optional.ofNullable(right);
  }
  public boolean isLeft() {
    return left != null;
  }
  public boolean isRight() {
    return right != null;
  }
  public <T> Optional<T> mapLeft(Function<? super L, T> mapper) {
    if (isLeft()) {
      return Optional.of(mapper.apply(left));
    }
    return Optional.empty();
  }
  public <T> Optional<T> mapRight(Function<? super R, T> mapper) {
    if (isRight()) {
      return Optional.of(mapper.apply(right));
    }
    return Optional.empty();
  }
  public String toString() {
    if (isLeft()) {
      return "Left(" + left +")";
    }
    return "Right(" + right +")";
  }
}

讓函數(shù)返回Either 而不是拋出一個Exception.

//只記錄異常
public static <T,R> Function<T, Either> lift(CheckedFunction<T,R> function) {
 return t -> {
  try {
   return Either.Right(function.apply(t));
  } catch (Exception ex) {
   return Either.Left(ex);
  }
 };
}
 
//記錄異常和值
public static <T,R> Function<T, Either> liftWithValue(CheckedFunction<T,R> function) {
 return t -> {
  try {
   return Either.Right(function.apply(t));
  } catch (Exception ex) {
   return Either.Left(Pair.of(ex,t));
  }
 };
}

/**調用Either.lift 捕獲異常繼續(xù)執(zhí)行*/
public void map(){
    List<String> myList = Arrays.asList("1", "2", "3", "4", "5", "6");
    myList.stream()
      .map(Either.lift(item -> doSomething(item)))
      .forEach(System.out::println);
}

總結:

如果你想在Lambda中調用它checkedException,你可以將其包裝成一個RuntimeException 。建議您創(chuàng)建一個抽象進行調用,這樣您就不會每次try/catch。也可以使用  Either 或其他類型來包裝函數(shù)的結果,使流不會終止。

以上所述是小編給大家介紹的Java Streams 中的異常處理詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • Springcloud Alibaba超詳細使用詳解

    Springcloud Alibaba超詳細使用詳解

    SpringCloudAlibaba是一款優(yōu)秀的微服務架構,在市面上有著廣泛的應用,這篇文章介紹了SpringCloudAlibaba的一些基本使用,適合初學者,希望能夠給大家?guī)韼椭?/div> 2024-08-08
  • Groovy編程入門攻略

    Groovy編程入門攻略

    這篇文章主要介紹了Groovy編程入門攻略,Groovy是一種同樣使用Java虛擬機的動態(tài)語言,需要的朋友可以參考下
    2015-07-07
  • SpringBoot中@ConfigurationProperties自動獲取配置參數(shù)的流程步驟

    SpringBoot中@ConfigurationProperties自動獲取配置參數(shù)的流程步驟

    當需要獲取配置文件中很多參數(shù)時,我們可以定義參數(shù)的前綴相同,通過自動映射 進行獲取配置文件中參數(shù),所以本文給大家介紹了SpringBoot中@ConfigurationProperties自動獲取配置參數(shù)的流程步驟,需要的朋友可以參考下
    2024-11-11
  • Spring?Boot整合阿里開源中間件Canal實現(xiàn)數(shù)據(jù)增量同步

    Spring?Boot整合阿里開源中間件Canal實現(xiàn)數(shù)據(jù)增量同步

    這篇文章主要為大家介紹了Spring?Boot整合阿里開源中間件Canal實現(xiàn)數(shù)據(jù)增量同步示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Spring事務中@Transactional注解不生效的原因分析與解決

    Spring事務中@Transactional注解不生效的原因分析與解決

    在Spring框架中,@Transactional注解是管理數(shù)據(jù)庫事務的核心方式,本文將深入分析事務自調用的底層原理,解釋為什么事務不生效,并提供多種解決方案,希望對大家有所幫助
    2025-03-03
  • 基于mybatis-plus-generator實現(xiàn)代碼自動生成器

    基于mybatis-plus-generator實現(xiàn)代碼自動生成器

    這篇文章專門為小白準備了入門級mybatis-plus-generator代碼自動生成器,可以提高開發(fā)效率。文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-05-05
  • 教你使用eclipse?搭建Swt?環(huán)境的全過程

    教你使用eclipse?搭建Swt?環(huán)境的全過程

    本文給大家分享使用eclipse?搭建Swt?環(huán)境的全過程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • Java 數(shù)組迭代你會用嗎

    Java 數(shù)組迭代你會用嗎

    Java 數(shù)組是我們學習或工作中常用到的數(shù)據(jù)結構,我們會經常寫數(shù)組迭代的代碼,本文介紹三種數(shù)組迭代的方式,感興趣的可以了解一下
    2021-09-09
  • 關于MyBatis的foreach標簽常用方法

    關于MyBatis的foreach標簽常用方法

    這篇文章主要介紹了關于MyBatis的foreach標簽常用方法,foreach 標簽可以用來遍歷數(shù)組、列表和 Map 等集合參數(shù),實現(xiàn)批量操作或一些簡單 SQL 操作,需要的朋友可以參考下
    2023-05-05
  • maven私服搭建與使用教程

    maven私服搭建與使用教程

    在使用maven進行Java項目的開發(fā)過程中,難免會有些公共的私有庫,這些庫是不太方便放到中央倉庫的,可以通過Nexus搭建一個私有倉庫,這篇文章主要介紹了maven私服搭建與使用,需要的朋友可以參考下
    2023-03-03

最新評論

六安市| 南华县| 磐石市| 修武县| 新竹市| 柳河县| 乌拉特前旗| 宝应县| 璧山县| 贵溪市| 军事| 古蔺县| 金乡县| 徐水县| 内乡县| 萨嘎县| 长治市| 贵州省| 澄江县| 鹤山市| 石棉县| 甘德县| 本溪市| 清河县| 乌拉特中旗| 定安县| 藁城市| 西乡县| 沙田区| 达孜县| 三亚市| 秭归县| 南平市| 科技| 若尔盖县| 惠州市| 三原县| 保靖县| 扶余县| 东乡| 莱西市|