国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

跳出Lambda表達(dá)式forEach()循環(huán)解決思路

這篇具有很好參考價值的文章主要介紹了跳出Lambda表達(dá)式forEach()循環(huán)解決思路。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

背景

在一次需求開發(fā)時,發(fā)現(xiàn)使用Lambda的forEach()跳不出循環(huán)。如下示例代碼,想在遍歷滿足條件時跳出循環(huán)。

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 4, 5, 7, 9, 11);

        list.forEach(e -> {
            if (e % 2 == 0) {
                System.out.println("foreach -- " + e);
                return;
            }
            System.out.println(e);
        });

        System.out.println(list);
    }

運(yùn)行結(jié)果:
跳出Lambda表達(dá)式forEach()循環(huán)解決思路,小白啟程,java,lambda,后端
可以看出在forEach()中使用return并不會退出整個循環(huán),和普通for循環(huán)return意義不同,仍會繼續(xù)遍歷。

原因

在普通for循環(huán)中,跳出循環(huán)使用break,結(jié)束本次循環(huán)使用continue,結(jié)束for循環(huán)所在的整個執(zhí)行方法使用return。

      for (Integer e : list) {
            if (e % 2 == 0) {
                break;  // return直接整個函數(shù)終止執(zhí)行返回,break for循環(huán)方法終止執(zhí)行
            }
            System.out.println(e);
        }

Lambda表達(dá)式中,函數(shù)式接口Consumer 的抽象方法accept引用實(shí)現(xiàn)循環(huán)體中的邏輯。
所以forEach()處理一個個的執(zhí)行方法accept(t),非循環(huán)體。在執(zhí)行方法中使用return將處理方法返回,但不能結(jié)束整個forEach()。

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
@FunctionalInterface
public interface Consumer<T> {

    void accept(T t);

    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

優(yōu)化方案

跳出Lambda表達(dá)式forEach()循環(huán)解決思路有以下幾種:

  • 拋異常
    在遍歷時,若需要跳出循環(huán),通過拋異常結(jié)束forEach()循環(huán),在循環(huán)外catch異常不處理。首先此方案不夠優(yōu)雅,其次若循環(huán)邏輯塊中有其他拋異常的地方,會受影響不易發(fā)現(xiàn)。
   public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 4, 5, 7, 9, 11);

        try {
            list.forEach(e -> {
                if (e % 2 == 0) {
                    System.out.println("foreach -- " + e);
                    throw new RuntimeException("跳出循環(huán)");
                }
                System.out.println(e);
            });
        } catch (Exception e) {}

        System.out.println(list);
   }

執(zhí)行結(jié)果:
跳出Lambda表達(dá)式forEach()循環(huán)解決思路,小白啟程,java,lambda,后端

  • 使用普通for循環(huán)
    使用普通for循環(huán)替代Lambda表達(dá)式forEach()循環(huán),在代碼塊中使用break即可跳出循環(huán)。

  • 使用Lambda表達(dá)式filter()實(shí)現(xiàn)
    換個實(shí)現(xiàn)思路,訴求是遍歷list遇到第一個滿足條件的item跳出循環(huán),那么轉(zhuǎn)成過濾整個list,返回第一個滿足條件的item。

Optional<Integer> first = list.stream().filter(e -> e % 2 == 0).findFirst();
System.out.println(first.orElse(null));
  • 使用anyMatch()
    原理類似filter(),遇到滿足條件的item跳出遍歷返回。
      list.stream().anyMatch(e -> {
            if (e % 2 == 0) {
                System.out.println("跳出循環(huán) -- " + e);
                return true;
            }
            System.out.println(e);
            return false;
        });

執(zhí)行結(jié)果:
跳出Lambda表達(dá)式forEach()循環(huán)解決思路,小白啟程,java,lambda,后端

總結(jié)

Lambda表達(dá)式forEach()函數(shù)不支持return跳出循環(huán),不建議使用拋異常方式結(jié)束循環(huán),可以考慮使用普通for或利用Lambda表達(dá)式的函數(shù)實(shí)現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-693917.html

到了這里,關(guān)于跳出Lambda表達(dá)式forEach()循環(huán)解決思路的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 進(jìn)階JAVA篇- Lambda 表達(dá)式與 Lambda 表達(dá)式的省略規(guī)則

    進(jìn)階JAVA篇- Lambda 表達(dá)式與 Lambda 表達(dá)式的省略規(guī)則

    目錄 ? ? ? ? 1.0 什么是 Lambda 表達(dá)式? ? ? ? ? 1.1 既然跟匿名內(nèi)部類相關(guān),先來回顧匿名內(nèi)部類。 ? ? ? ? ?1.2 Lambda 表達(dá)式與匿名內(nèi)部類之間的關(guān)系。 ? ? ? ? 1.3 函數(shù)式接口 ? ? ? ? 1.4 在具體代碼中來操作一下 ? ? ? ? 2.0?Lambda 表達(dá)式省略規(guī)則 ??????? ?Lambda 表達(dá)

    2024年02月08日
    瀏覽(29)
  • 探索Python中的函數(shù)式編程:Lambda表達(dá)式與函數(shù)式工具【第135篇—Lambda表達(dá)式】

    探索Python中的函數(shù)式編程:Lambda表達(dá)式與函數(shù)式工具【第135篇—Lambda表達(dá)式】

    前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。【點(diǎn)擊進(jìn)入巨牛的人工智能學(xué)習(xí)網(wǎng)站】。 在Python編程世界中,函數(shù)式編程逐漸成為了一種流行的范式,特別是在處理數(shù)據(jù)和編寫簡潔、高效代碼時。函數(shù)式編程的核心思想是將計算視

    2024年04月08日
    瀏覽(32)
  • .NET寫一個自己的Lambda表達(dá)式與表達(dá)式樹

    .NET寫一個自己的Lambda表達(dá)式與表達(dá)式樹

    LambdaExpression繼承Expression Expression 又繼承LambdaExpressio 所以,LambdaExpression與 Expression 的區(qū)別在于:泛型類以靜態(tài)類型的方法標(biāo)識了它是什么種類的表達(dá)式,也就是說,他確定了返回類型和參數(shù)。所以顯然,TDelegate必須是一個委托類型。 注意 :并非所有的Lambda表達(dá)式都能轉(zhuǎn)換成

    2024年02月13日
    瀏覽(23)
  • 【JAVA】包裝類、正則表達(dá)式、Arrays類、Lambda表達(dá)式

    包裝類是8種基本數(shù)據(jù)類型對應(yīng)的引用類型 作用:后期的集合和泛型不支持基本類型,只能使用包裝類 基本數(shù)據(jù)類型和其對應(yīng)的引用數(shù)據(jù)類型的變量可以互相賦值 基本數(shù)據(jù)類型 引用數(shù)據(jù)類型 byte Byte short Short int Integer long Long char Character float Float double Double boolean Boolean 包裝類

    2024年02月13日
    瀏覽(32)
  • 23.Lambda表達(dá)式

    23.Lambda表達(dá)式

    Lambda 表達(dá)式(lambda expression)是一個匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名,直接對應(yīng)于其中的lambda抽象(lambda abstraction),是一個匿名函數(shù),即沒有函數(shù)名的函數(shù)。Lambda表達(dá)式可以表示閉包(注意和數(shù)學(xué)傳統(tǒng)意義上的不同)。Lambda表達(dá)式是Java SE 8中一個重要的新特性。

    2024年02月03日
    瀏覽(30)
  • Java- Lambda表達(dá)式

    目錄 一、Lambda簡介 二、Lambda使用前提 三、Lambda語法 1.操作符 a.\\\"-\\\" ?b.\\\"::\\\" 2.格式? a.無參數(shù) b.有參數(shù) 四、Lambda演化過程 五、Lambda實(shí)現(xiàn)排序 Lambda 表達(dá)式,也可稱為閉包,它是推動 Java 8 發(fā)布的最重要新特性。Lambda 允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)

    2024年02月03日
    瀏覽(28)
  • Java Lambda表達(dá)式

    1.1 函數(shù)式編程思想概括 在數(shù)學(xué)中,函數(shù)就是有輸入量、輸出量的一套計算方案,也就是“拿數(shù)據(jù)做操作” 面向?qū)ο笏枷霃?qiáng)調(diào)“必須通過對象的形式來做事情” 函數(shù)式思想則盡量忽略面

    2024年02月07日
    瀏覽(42)
  • 深入理解lambda表達(dá)式

    深入理解lambda表達(dá)式

    var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.Use(async (context, next) = { // Add code before request. }); 這段C#代碼是用于設(shè)置ASP.NET Core應(yīng)用中的中間件。下面是詳細(xì)解釋: app.Use : 這個方法是用來向應(yīng)用的請求處理管道中添加一個中間件的。在ASP.NET Core中,中間件用于處

    2024年02月20日
    瀏覽(30)
  • Lambda表達(dá)式常用場景

    如果你的集合里泛型是ListString,那么可以直接用String.join(\\\",\\\",你的集合),把它變?yōu)樽址?String.join(\\\",\\\", yourList) 但是如果你的集合是,ListInteger、ListLong,那么String.join這個方法就不適應(yīng)了. 你可以用lamba表達(dá)式 String string= longs.stream().map(Object::toString).collect(Collectors.joining(\\\",\\\")); 方

    2024年02月11日
    瀏覽(22)
  • 9.4 Lambda表達(dá)式

    9.4 Lambda表達(dá)式

    2024年01月22日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包