java8 - stream操做

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

import org.junit.Test;

/*
 * 1、 Stream 的操做步驟
 * 
 * 1. 建立 Stream
 * 
 * 2. 中間操做
 * 
 * 3. 終止操做
 */
public class TestStreamAPI1 {
    
    List<Employee> emps = Arrays.asList(
            new Employee(102, "李四", 59, 6666.66),
            new Employee(101, "張三", 18, 9999.99),
            new Employee(103, "王五", 28, 3333.33),
            new Employee(104, "趙六", 8, 7777.77),
            new Employee(104, "趙六", 8, 7777.77),
            new Employee(104, "趙六", 8, 7777.77),
            new Employee(105, "田七", 38, 5555.55)
    );
    
    //2. 中間操做
    /*
        映射
        map——接收 Lambda , 將元素轉換成其餘形式或提取信息。接收一個函數做爲參數,該函數會被應用到每一個元素上,並將其映射成一個新的元素。
        flatMap——接收一個函數做爲參數,將流中的每一個值都換成另外一個流,而後把全部流鏈接成一個流
     */
    @Test
    public void test1(){
        Stream<String> str = emps.stream()
            .map((e) -> e.getName());
        
        System.out.println("-------------------------------------------");
        
        List<String> strList = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
        
        Stream<String> stream = strList.stream()
               .map(String::toUpperCase);
        
        stream.forEach(System.out::println);
        
        Stream<Stream<Character>> stream2 = strList.stream()
               .map(TestStreamAPI1::filterCharacter);
        
        stream2.forEach((sm) -> {
            sm.forEach(System.out::println);
        });
        
        System.out.println("---------------------------------------------");
        
        Stream<Character> stream3 = strList.stream()
               .flatMap(TestStreamAPI1::filterCharacter);
        
        stream3.forEach(System.out::println);
    }

    public static Stream<Character> filterCharacter(String str){
        List<Character> list = new ArrayList<>();
        
        for (Character ch : str.toCharArray()) {
            list.add(ch);
        }
        
        return list.stream();
    }
    
    /*
        sorted()——天然排序
        sorted(Comparator com)——定製排序
     */
    @Test
    public void test2(){
        emps.stream()
            .map(Employee::getName)
            .sorted()
            .forEach(System.out::println);
        
        System.out.println("------------------------------------");
        
        emps.stream()
            .sorted((x, y) -> {
                if(x.getAge() == y.getAge()){
                    return x.getName().compareTo(y.getName());
                }else{
                    return Integer.compare(x.getAge(), y.getAge());
                }
            }).forEach(System.out::println);
    }
}

 

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

import org.junit.Test;

import com.atguigu.java8.Employee.Status;

/*
 * 1、 Stream 的操做步驟
 * 
 * 1. 建立 Stream
 * 
 * 2. 中間操做
 * 
 * 3. 終止操做
 */
public class TestStreamAPI2 {
    
    List<Employee> emps = Arrays.asList(
            new Employee(102, "李四", 59, 6666.66, Status.BUSY),
            new Employee(101, "張三", 18, 9999.99, Status.FREE),
            new Employee(103, "王五", 28, 3333.33, Status.VOCATION),
            new Employee(104, "趙六", 8, 7777.77, Status.BUSY),
            new Employee(104, "趙六", 8, 7777.77, Status.FREE),
            new Employee(104, "趙六", 8, 7777.77, Status.FREE),
            new Employee(105, "田七", 38, 5555.55, Status.BUSY)
    );
    
    //3. 終止操做
    /*
        allMatch——檢查是否匹配全部元素
        anyMatch——檢查是否至少匹配一個元素
        noneMatch——檢查是否沒有匹配的元素
        findFirst——返回第一個元素
        findAny——返回當前流中的任意元素
        count——返回流中元素的總個數
        max——返回流中最大值
        min——返回流中最小值
     */
    @Test
    public void test1(){
            boolean bl = emps.stream()
                .allMatch((e) -> e.getStatus().equals(Status.BUSY));
            
            System.out.println(bl);
            
            boolean bl1 = emps.stream()
                .anyMatch((e) -> e.getStatus().equals(Status.BUSY));
            
            System.out.println(bl1);
            
            boolean bl2 = emps.stream()
                .noneMatch((e) -> e.getStatus().equals(Status.BUSY));
            
            System.out.println(bl2);
    }
    
    @Test
    public void test2(){
        Optional<Employee> op = emps.stream()
            .sorted((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()))
            .findFirst();
        
        System.out.println(op.get());
        
        System.out.println("--------------------------------");
        
        Optional<Employee> op2 = emps.parallelStream()
            .filter((e) -> e.getStatus().equals(Status.FREE))
            .findAny();
        
        System.out.println(op2.get());
    }
    
    @Test
    public void test3(){
        long count = emps.stream()
                         .filter((e) -> e.getStatus().equals(Status.FREE))
                         .count();
        
        System.out.println(count);
        
        Optional<Double> op = emps.stream()
            .map(Employee::getSalary)
            .max(Double::compare);
        
        System.out.println(op.get());
        
        Optional<Employee> op2 = emps.stream()
            .min((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));
        
        System.out.println(op2.get());
    }
    
    //注意:流進行了終止操做後,不能再次使用
    @Test
    public void test4(){
        Stream<Employee> stream = emps.stream()
         .filter((e) -> e.getStatus().equals(Status.FREE));
        
        long count = stream.count();
        
        stream.map(Employee::getSalary)
            .max(Double::compare);
    }
}

 

import java.util.Arrays;
import java.util.DoubleSummaryStatistics;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import org.junit.Test;

import com.atguigu.java8.Employee.Status;

public class TestStreamAPI3 {
    
    List<Employee> emps = Arrays.asList(
            new Employee(102, "李四", 79, 6666.66, Status.BUSY),
            new Employee(101, "張三", 18, 9999.99, Status.FREE),
            new Employee(103, "王五", 28, 3333.33, Status.VOCATION),
            new Employee(104, "趙六", 8, 7777.77, Status.BUSY),
            new Employee(104, "趙六", 8, 7777.77, Status.FREE),
            new Employee(104, "趙六", 8, 7777.77, Status.FREE),
            new Employee(105, "田七", 38, 5555.55, Status.BUSY)
    );
    
    //3. 終止操做
    /*
        歸約
        reduce(T identity, BinaryOperator) / reduce(BinaryOperator) ——能夠將流中元素反覆結合起來,獲得一個值。
     */
    @Test
    public void test1(){
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        
        Integer sum = list.stream()
            .reduce(0, (x, y) -> x + y);
        
        System.out.println(sum);
        
        System.out.println("----------------------------------------");
        
        Optional<Double> op = emps.stream()
            .map(Employee::getSalary)
            .reduce(Double::sum);
        
        System.out.println(op.get());
    }
    
    //需求:搜索名字中 「六」 出現的次數
    @Test
    public void test2(){
        Optional<Integer> sum = emps.stream()
            .map(Employee::getName)
            .flatMap(TestStreamAPI1::filterCharacter)
            .map((ch) -> {
                if(ch.equals('六'))
                    return 1;
                else 
                    return 0;
            }).reduce(Integer::sum);
        
        System.out.println(sum.get());
    }
    
    //collect——將流轉換爲其餘形式。接收一個 Collector接口的實現,用於給Stream中元素作彙總的方法
    @Test
    public void test3(){
        List<String> list = emps.stream()
            .map(Employee::getName)
            .collect(Collectors.toList());
        
        list.forEach(System.out::println);
        
        System.out.println("----------------------------------");
        
        Set<String> set = emps.stream()
            .map(Employee::getName)
            .collect(Collectors.toSet());
        
        set.forEach(System.out::println);

        System.out.println("----------------------------------");
        
        HashSet<String> hs = emps.stream()
            .map(Employee::getName)
            .collect(Collectors.toCollection(HashSet::new));
        
        hs.forEach(System.out::println);
    }
    
    @Test
    public void test4(){
        Optional<Double> max = emps.stream()
            .map(Employee::getSalary)
            .collect(Collectors.maxBy(Double::compare));
        
        System.out.println(max.get());
        
        Optional<Employee> op = emps.stream()
            .collect(Collectors.minBy((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary())));
        
        System.out.println(op.get());
        
        Double sum = emps.stream()
            .collect(Collectors.summingDouble(Employee::getSalary));
        
        System.out.println(sum);
        
        Double avg = emps.stream()
            .collect(Collectors.averagingDouble(Employee::getSalary));
        
        System.out.println(avg);
        
        Long count = emps.stream()
            .collect(Collectors.counting());
        
        System.out.println(count);
        
        System.out.println("--------------------------------------------");
        
        DoubleSummaryStatistics dss = emps.stream()
            .collect(Collectors.summarizingDouble(Employee::getSalary));
        
        System.out.println(dss.getMax());
    }
    
    //分組
    @Test
    public void test5(){
        Map<Status, List<Employee>> map = emps.stream()
            .collect(Collectors.groupingBy(Employee::getStatus));
        
        System.out.println(map);
    }
    
    //多級分組
    @Test
    public void test6(){
        Map<Status, Map<String, List<Employee>>> map = emps.stream()
            .collect(Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy((e) -> {
                if(e.getAge() >= 60)
                    return "老年";
                else if(e.getAge() >= 35)
                    return "中年";
                else
                    return "成年";
            })));
        
        System.out.println(map);
    }
    
    //分區
    @Test
    public void test7(){
        Map<Boolean, List<Employee>> map = emps.stream()
            .collect(Collectors.partitioningBy((e) -> e.getSalary() >= 5000));
        
        System.out.println(map);
    }
    
    //
    @Test
    public void test8(){
        String str = emps.stream()
            .map(Employee::getName)
            .collect(Collectors.joining("," , "----", "----"));
        
        System.out.println(str);
    }
    
    @Test
    public void test9(){
        Optional<Double> sum = emps.stream()
            .map(Employee::getSalary)
            .collect(Collectors.reducing(Double::sum));
        
        System.out.println(sum.get());
    }
}
相關文章
相關標籤/搜索