JAVA8——Stream()
阿新 • • 發佈:2020-08-22
Stream API常用方法:
Stream操作分類 | ||
中間操作 | 無狀態 | unordered() filter() map() mapToInt() mapToLong() mapToDouble() flatMap() flatMapToInt() flatMapToLong() flatMapToDouble() peek() |
有狀態 | distinct() sorted() boxed() limit() skip() | |
結束操作 | 非短路操作 | forEach() forEachOrdered() toArray() reduce() collect() max() min() count() |
短路操作 | anyMatch() allMatch() noneMatch() findFirst() findAny() |
常用中介軟體
filter:過濾流,過濾流中的元素,返回一個符合條件的Stream
map:轉換流,將一種型別的流轉換為另外一種流。(mapToInt、mapToLong、mapToDouble返回int、long、double基本型別對應的Stream)
flatMap:簡單的說,就是一個或多個流合併成一個新流。(flatMapToInt、flatMapToLong、flatMapToDouble返回對應的IntStream、LongStream、DoubleStream流。)
distinct:返回去重的Stream。
sorted:返回一個排序的Stream。
peek:主要用來檢視流中元素的資料狀態。
limit:返回前n個元素資料組成的Stream。屬於短路操作
skip:返回第n個元素後面資料組成的Stream。
boxed: 將LongStream、IntStream、DoubleStream轉換成對應型別的Stream<T>
結束操作
forEach:迴圈操作Stream中資料。
toArray:返回流中元素對應的陣列物件。
reduce:聚合操作,用來做統計。
collect:聚合操作,封裝目標資料。
min、max、count:聚合操作,最小值,最大值,總數量。
anyMatch: 短路操作,有一個符合條件返回true。
allMatch:所有資料都符合條件返回true。
noneMatch:所有資料都不符合條件返回true。
findFirst:短路操作,獲取第一個元素。
findAny:短路操作,獲取任一元素。
forEachOrdered: 暗元素順序執行迴圈操作。
舉例說明
@Data public class Person { private Integer id; private String name; private String sex; private Integer age; }
map中介軟體例子
public class TestMap { public static void main(String[] args) { List<Person> persionList = new ArrayList<Person>(); persionList.add(new Person(1,"小陳","男",38)); persionList.add(new Person(2,"小小","女",2)); persionList.add(new Person(3,"小李","男",65)); persionList.add(new Person(4,"小王","女",20)); persionList.add(new Person(5,"小童","男",38)); persionList.add(new Person(6,"小劉","男",65)); //1、只取出該集合中所有姓名組成一個新集合 List<String> nameList=persionList.stream().map(Person::getName).collect(Collectors.toList()); System.out.println(nameList.toString()); //2、只取出該集合中所有id組成一個新集合 List<Integer> idList=persionList.stream().mapToInt(Person::getId).boxed().collect(Collectors.toList()); System.out.println(idList.toString()); //3、list轉map,key值為id,value為Person物件 Map<Integer, Person> personmap = persionList.stream().collect(Collectors.toMap(Person::getId, person -> person)); System.out.println(personmap.toString()); //4、list轉map,key值為id,value為name Map<Integer, String> namemap = persionList.stream().collect(Collectors.toMap(Person::getId, Person::getName)); System.out.println(namemap.toString()); //5、進行map集合存放,key為age值 value為Person物件 它會把相同age的物件放到一個集合中 Map<Integer, List<Person>> ageMap = persionList.stream().collect(Collectors.groupingBy(Person::getAge)); System.out.println(ageMap.toString()); //6、獲取最小年齡 Integer ageMin = persionList.stream().mapToInt(Person::getAge).min().getAsInt(); System.out.println("最小年齡為: "+ageMin); //7、獲取最大年齡 Integer ageMax = persionList.stream().mapToInt(Person::getAge).max().getAsInt(); System.out.println("最大年齡為: "+ageMax); //8、集合年齡屬性求和 Integer ageAmount = persionList.stream().mapToInt(Person::getAge).sum(); System.out.println("年齡總和為: "+ageAmount); } }
filter相關
public class TestFilter { public static void main(String[] args) { List<Person> persionList = new ArrayList<Person>(); persionList.add(new Person(1, "張三", "男", 8)); persionList.add(new Person(2, "小小", "女", 2)); persionList.add(new Person(3, "李四", "男", 25)); persionList.add(new Person(4, "王五", "女", 8)); persionList.add(new Person(5, "趙六", "女", 25)); persionList.add(new Person(6, "大大", "男", 65)); //1、查詢年齡大於20歲的人數 long age=persionList.stream().filter(p->p.getAge()>20).count(); System.out.println(age); //2、查詢年齡大於20歲,性別為男的人數 List<Person> ageList=persionList.stream().filter(p->p.getAge()>20).filter(p->"男".equals(p.getSex())).collect(Collectors.toList()); System.out.println(ageList.size()); }
sorted相關
//陣列相關
public class TestSort { String[] arr1 = {"abc","a","bc","abcd"}; /** * 按照字元長度排序 */ @Test public void testSorted1_(){ Arrays.stream(arr1).sorted(Comparator.comparing(String::length)).forEach(System.out::println); //輸出:a、bc、abc、abcd } /** * 倒序 * reversed(),java8泛型推導的問題,所以如果comparing裡面是非方法引用的lambda表示式就沒辦法直接使用reversed() * Comparator.reverseOrder():也是用於翻轉順序,用於比較物件(Stream裡面的型別必須是可比較的) * Comparator. naturalOrder():返回一個自然排序比較器,用於比較物件(Stream裡面的型別必須是可比較的) */ @Test public void testSorted2_(){ Arrays.stream(arr1).sorted(Comparator.comparing(String::length).reversed()).forEach(System.out::println); //輸出:abcd、abc、bc、a Arrays.stream(arr1).sorted(Comparator.reverseOrder()).forEach(System.out::println); //輸出:bc、abcd、abc、a Arrays.stream(arr1).sorted(Comparator.naturalOrder()).forEach(System.out::println); //輸出:a、abc、abcd、bc } /** * 先按照首字母排序 * 之後按照String的長度排序 */ @Test public void testSorted3_(){ Arrays.stream(arr1).sorted(Comparator.comparing(this::com1).thenComparing(String::length)).forEach(System.out::println); } //輸出:a、abc、abcd、bc public char com1(String x){ return x.charAt(0); } }
//集合相關
public class TestSort { public static void main(String[] args) { List<Person> persionList = new ArrayList<Person>(); persionList.add(new Person(1, "張三", "男", 8)); persionList.add(new Person(2, "小小", "女", 2)); persionList.add(new Person(3, "李四", "男", 25)); persionList.add(new Person(4, "王五", "女", 8)); persionList.add(new Person(5, "趙六", "女", 25)); persionList.add(new Person(6, "大大", "男", 65)); //1、找到年齡最小的歲數 Collections.sort(persionList, (x, y) -> x.getAge().compareTo(y.getAge())); Integer age = persionList.get(0).getAge(); System.out.println("年齡最小的有:" + age); //輸出:年齡最小的有:2 //2、找到年齡最小的姓名 String name = persionList.stream() .sorted(Comparator.comparingInt(x -> x.getAge())) .findFirst() .get().getName(); System.out.println("年齡最小的姓名:" + name); //輸出:年齡最小的姓名:小小 } }