Java1.8新特性Stream流處理集合元素


最近剛好需要頻繁的操作一些集合對象,之前都是for循環然后查詢賦值集合copy感覺有些復雜,之前看到過使用stream流,但是不會使用,抽空學習下如何使用。

一、為什么使用stream流

  利用java8新特性,可以用簡潔高效的代碼來實現一些數據處理。

一、如何使用stream流

 下表展示 Collectors 類的靜態工廠方法。

  1、定義1個phone對象:

  

public class Phone {
    private Integer id;
    private String name;
    private BigDecimal money;
    private Integer num;
    ...
    
}

  2、創建stream測試類:

package javastream;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.TreeSet;
import java.util.stream.Collectors;

/**
 * 學習使用java1.8的新特性使用stream流操作集合對象
 * @author dell
 *
 */
public class StreamDemo {
    
    public static void main(String[] args) {
        
        List<Phone> phoneList = new ArrayList<>();//存放apple對象集合
          
        Phone phone1 =  new Phone(1,"蘋果",new BigDecimal("3.25"),10);
        Phone phone12 = new Phone(1,"華為",new BigDecimal("1.35"),20);
        Phone phone2 =  new Phone(2,"小米",new BigDecimal("2.89"),30);
        Phone phone3 =  new Phone(3,"oppo",new BigDecimal("9.99"),40);
        phoneList.add(phone1);
        phoneList.add(phone12);
        phoneList.add(phone2);
        phoneList.add(phone3);
        groupList(phoneList);
        listToMap(phoneList);
        filterList(phoneList);
        maxAndMin(phoneList);
    }
    
    /**
     * 1、分組測試
     * List里面的對象元素,以某個屬性來分組,例如,以id分組,將id相同的放在一起:
     */
    public static void groupList(List<Phone> phoneList){
        Map<Integer, List<Phone>> phoneMap = phoneList.stream().collect(Collectors.groupingBy(Phone::getId));
        System.err.println("分組測試-->List里面的對象元素"+phoneMap.toString());
    }
    
    /**
     * 2、List轉Map  
     *  id為key,apple對象為value,可以這么做:
     * List -> Map
     * 需要注意的是:
     * toMap 如果集合對象有重復的key,會報錯Duplicate key ....
     *  apple1,apple12的id都為1。
     *  可以用 (k1,k2)->k1 來設置,如果有重復的key,則保留key1,舍棄key2
     */
    public static void listToMap(List<Phone> phoneList){
        Map<Integer, Phone> phoneMap = phoneList.stream().collect(Collectors.toMap(Phone::getId, a->a,(k1,k2)->k1));
        System.out.println("List轉Map-->Map里面的對象元素"+phoneMap.toString());
    }
    
    /**
     * 3、過濾Filter
     * 從集合中過濾出來符合條件的元素:
     */
    public static void filterList(List<Phone> phoneList){
        List<Phone> filterList = phoneList.stream().filter(p -> p.getName().equals("蘋果")).collect(Collectors.toList());
        System.err.println("過濾Filter-->filterList過濾后的對象元素:"+filterList);
    }
    
    /**
     * 4、將集合中的數據按照某個屬性求和:
     */
    public static void totalMoney(List<Phone> phoneList){
        //計算 總金額
        BigDecimal totalMoney = phoneList.stream().map(Phone::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
        System.err.println("按照某個屬性求和-->totalMoney:"+totalMoney);  //totalMoney:17.48
    }
    
    /**
     * 5、Collectors.maxBy 和 Collectors.minBy 來計算流中的最大或最小值。
     */
    public static void maxAndMin(List<Phone> phoneList){
        Optional<Phone> maxPhone = phoneList.stream().
              collect(Collectors.maxBy(Comparator.comparing(Phone::getMoney)));
        maxPhone.ifPresent(System.out::println);
        Optional<Phone> minPhone = phoneList.stream().
              collect(Collectors.minBy(Comparator.comparing(Phone::getMoney)));
        minPhone.ifPresent(System.out::println);
    }

    /**
     * 6、根據id去重
     */
    public static void uniqueList(List<Phone> phoneList){
        //單個字段去重
        List<Phone> unique = phoneList.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Phone::getId))), ArrayList<Phone>::new));
        System.err.println("根據id去重-->unique:"+unique);
        //多個字段去重
        List<Phone> unique2 = phoneList.stream()
                .collect(Collectors.collectingAndThen(
                        Collectors.toCollection(
                                () -> new TreeSet<>(Comparator.comparing(p -> p.getId() + ";" + p.getName()))),
                        ArrayList<Phone>::new));
        System.err.println("多個字段去重-->unique2:"+unique2);
        
    }
    
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM