最近剛好需要頻繁的操作一些集合對象,之前都是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); } }