高效 告別996,開啓java高效編程之門 3-3實戰:利用Lambda+Stream處理業務邏輯

1    重點

1.1    本節目的html

僅僅爲了展現Stream流操做集合的便利性,看看demo就好,後邊他大爺的還繼續講。java

 

1.2    對如下方法的應用(這是本人對留的方法的理解,有不對的地方,歡迎你們指正)
編程

Stream.peek:    對流的操做,不操做流,不執行json

Returns a stream consisting of the elements of this stream, truncated  to be no longer than {@code maxSize} in length.windows

<p>This is a <a href="package-summary.html#StreamOps">short-circuiting stateful intermediate operation</a>.安全

 

Collection.stream   創建流多線程

Returns a sequential app

 

Stream.filter     篩選出結構一致的集合ide

Returns a stream consisting of the results of applying the given function to the elements of this stream.測試

 

Stream.limit(n)  取出前n條

 

Stream.map    返回新的流(結構可能不一致)

@return the new stream

  

Stream.collect   返回可操做的集合

@return an {@code Optional} describing the minimum element of this stream, * or an empty {@code Optional} if the stream is empty

 

 

 

 

 

2    代碼演練

需求:

 根據第一章需求,女盆友提出需求
* 1 打印全部商品
* 2 圖書類的商品必定給買
* 3 最貴的買兩件
* 4 打印最貴的兩件商品的名稱和總價

 


測試類:

package com.imooc.zhangxiaoxi.stream;

import com.alibaba.fastjson.JSON;
import com.imooc.zhangxiaoxi.lambda.cart.CartService;
import com.imooc.zhangxiaoxi.lambda.cart.Sku;
import com.imooc.zhangxiaoxi.lambda.cart.SkuCategoryEnum;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;

/**
 * StreamVs
 *
 * @author 魏豆豆
 * @date 2020/4/7
 */
public class StreamVs {

    /**
     * 流和普通方法對比,本節應用普通方法
     *
     * 根據第一章需求,女盆友提出需求
     * 1    打印全部商品
     * 2    圖書類的商品必定給買
     * 3    最貴的買兩件
     * 4    打印最貴的兩件商品的名稱和總價
     */

    /**
     * 普通方法
     */
   /* @Test
    public void oldCartHandle(){
        //1 打印全部商品
        List<Sku> skuList = CartService.getSkuList();
        System.out.println("====================================================================================================");
        for(Sku sku: skuList){
            System.out.println(JSON.toJSONString(sku,true));
        }


        //2 排除圖書類
        List<Sku> skuListNoBooks = new ArrayList<Sku>();
        for(Sku sku:skuList){
            if(!sku.getSkuCategory().equals(SkuCategoryEnum.BOOKS)){
                skuListNoBooks.add(sku);
            }
        }

        //3 最貴的買兩件
        skuListNoBooks.sort(new Comparator<Sku>() {
            @Override
            public int compare(Sku o1, Sku o2) {
                if(o1.getTotalPrice()> o2.getTotalPrice()){
                    return -1;
                }else if(o1.getTotalPrice() < o2.getTotalPrice()){
                    return 1;
                }else{
                    return 0;
                }
            }
        });

        List<Sku> skuListPreTwo = new ArrayList<Sku>();
        for(int i = 0;i<2;i++){
            skuListPreTwo.add(skuListNoBooks.get(i));
        }

        System.out.println("====================================================================================================");
        Double totalPrice = 0.0;
        for(Sku sku:skuListPreTwo){
            totalPrice+=sku.getTotalPrice();
        }

        List<String> skuNameList = new ArrayList<String>();
        for (Sku sku:skuListPreTwo){
            skuNameList.add(sku.getSkuName());
        }


        System.out.println("商品總價爲:"+totalPrice);
        System.out.println("商品名稱爲:"+ JSON.toJSONString(skuNameList,true));
    }*/

    @Test
    /**
     * 使用Stream流的方式來實現需求:
     */
    public void newCartHandler(){

        //定義  原子引用類,能夠保你多線程 安全,防止多線程 計數衝突
        AtomicReference<Double> money = new AtomicReference<>(Double.valueOf(0.0));

        List<String> skuNameList =
        CartService.getSkuList()
                /**
                 * 1    創建stream流
                 */
                .stream()
                /**
                 * 2    打印全部商品的信息
                 */
                .peek(sku -> System.out.println(JSON.toJSONString(sku,true)))
                /**
                 * 3    篩選出非圖書類
                 */
                .filter(sku -> !sku.getSkuCategory().equals(SkuCategoryEnum.BOOKS))
                /**
                 * 4    按照價格排序(使用方法引用)
                 * reversed排序反轉 從大到小
                 */
                .sorted(Comparator.comparing(Sku::getTotalPrice).reversed())
                /**
                 * 5    取出前兩條
                 */
                .limit(3)
                /**
                 * 6    累加商品總金額
                 */
                .peek(sku -> {money.set(money.get()+sku.getTotalPrice());})
                /**
                 * 7    取出商品名稱集合
                 */
                .map(sku -> sku.getSkuName())
                /**
                 * 8    收集結果
                 */
                .collect(Collectors.toList());

                //由於money是get類型,須要get一下值
                System.out.println("商品總價爲:"+money.get());
                System.out.println("商品名稱爲:"+ JSON.toJSONString(skuNameList,true));
    }


}

 

 

 

 

其餘類參考2-3:

 

打印日誌:

D:\java\jdk\jdk9\jdk-9+181_windows-x64_ri\java-se-9-ri\jdk-9\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=38089:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar;D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\plugins\junit\lib\junit-rt.jar;D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\plugins\junit\lib\junit5-rt.jar;F:\xiangmu3\Xin\test996\target\test-classes;F:\xiangmu3\Xin\test996\target\classes;F:\xiangmu3\Xin\test996\lib\com\google\guava\guava\28.2-jre\guava-28.2-jre.jar;F:\xiangmu3\Xin\test996\lib\com\google\guava\failureaccess\1.0.1\failureaccess-1.0.1.jar;F:\xiangmu3\Xin\test996\lib\com\google\guava\listenablefuture\9999.0-empty-to-avoid-conflict-with-guava\listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar;F:\xiangmu3\Xin\test996\lib\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;F:\xiangmu3\Xin\test996\lib\org\checkerframework\checker-qual\2.10.0\checker-qual-2.10.0.jar;F:\xiangmu3\Xin\test996\lib\com\google\errorprone\error_prone_annotations\2.3.4\error_prone_annotations-2.3.4.jar;F:\xiangmu3\Xin\test996\lib\com\google\j2objc\j2objc-annotations\1.3\j2objc-annotations-1.3.jar;F:\xiangmu3\Xin\test996\lib\junit\junit\4.12\junit-4.12.jar;F:\xiangmu3\Xin\test996\lib\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;F:\xiangmu3\Xin\test996\lib\com\alibaba\fastjson\1.2.58\fastjson-1.2.58.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit3 com.imooc.zhangxiaoxi.stream.StreamVs,newCartHandler
{
    "skuCategory":"ELECTRONICS",
    "skuId":2020001,
    "skuName":"無人機",
    "skuPrice":999.0,
    "totalNum":1,
    "totalPrice":999.0
}
{
    "skuCategory":"CLOTHING",
    "skuId":2020002,
    "skuName":"T-shirt",
    "skuPrice":50.0,
    "totalNum":2,
    "totalPrice":100.0
}
{
    "skuCategory":"BOOKS",
    "skuId":2020003,
    "skuName":"人生的枷鎖",
    "skuPrice":30.0,
    "totalNum":1,
    "totalPrice":30.0
}
{
    "skuCategory":"BOOKS",
    "skuId":2020004,
    "skuName":"老人與海",
    "skuPrice":20.0,
    "totalNum":1,
    "totalPrice":20.0
}
{
    "skuCategory":"BOOKS",
    "skuId":2020005,
    "skuName":"劍指高效編程",
    "skuPrice":288.0,
    "totalNum":1,
    "totalPrice":288.0
}
{
    "skuCategory":"CLOTHING",
    "skuId":2020006,
    "skuName":"大頭皮鞋",
    "skuPrice":300.0,
    "totalNum":1,
    "totalPrice":300.0
}
{
    "skuCategory":"SPROTS",
    "skuId":2020007,
    "skuName":"槓鈴",
    "skuPrice":2000.0,
    "totalNum":1,
    "totalPrice":2000.0
}
{
    "skuCategory":"ELECTRONICS",
    "skuId":2020008,
    "skuName":"ThinkPad",
    "skuPrice":5000.0,
    "totalNum":1,
    "totalPrice":5000.0
}
商品總價爲:7999.0
商品名稱爲:[
    "ThinkPad",
    "槓鈴",
    "無人機"
]

Process finished with exit code 0
相關文章
相關標籤/搜索