Java8-Stream流操作(一)

76 阅读3分钟

Java 8 流的新类 java.util.stream.Collectors 实现了 java.util.stream.Collector 接口,同时又提供了大量的方法对流 ( stream ) 的元素执行 map 和reduce 操作,或者统计操作。 

1、 Collectors.toList()

1.1 作用

Collectors.toList() 将流中的所有元素导出到一个新的列表 ( List ) 中。 

1.2 代码示例

package com.xintu.java8;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class XinTuJava8ListExample {
    public static void main(String[] args) {
        //将流中的所有元素导出到一个新的列表 ( List ) 中
        List<String> list = Stream.of("A", "B", "C").collect(Collectors.toList());
        list.forEach(s -> System.out.println(s));
    }
}

执行结果:

ABC

D  

2、 Collectors.toSet()

2.1 作用

Collectors.toSet() 把流中的所有元素导出到一个集合 ( Set ) 中,并排除重复的元素。

2.2 代码示例

package com.xintu.java8;

import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class XinTuJava8SetExample {
    public static void main(String[] args) {
        Set<String> set = Stream.of("A", "B", "C", "D","A").collect(Collectors.toSet());
        set.forEach(s -> System.out.println(s));
    }
}

执行结果: 

A

B

C

D  

3、 Collectors.toMap()

3.1 作用

Collectors.toMap() 将流中的所有元素导出到一个哈希表 ( Map ) 中。该方法接受两个参数,第一个参数用于生成键 ( key ) ,第二个参数用于生成值 ( value )。两个参数都是 Lambda 表达式。 

3.2 代码示例

package com.xintu.java8;

import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class XinTuJava8MapExample {
    public static void main(String[] args) {
        Map<String, String> map = Stream.of("A", "B", "C", "D").collect(Collectors.toMap(k -> k, v -> v + v));
        map.forEach((k, v) -> System.out.println("key:" + k + " value:" + v));
    }
}

执行结果: 

key:A value:AA

key:B value:BB

key:C value:CC

key:D value:DD  

4、Collectors.mapping()

4.1 作用

Collectors.mapping() 一般用于多重 map and reduce 中。 Java 文档中描述的原型如下 

mapping(Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)  

第一个参数用于 map ,第二个参数用于 reduce。 

4.2 代码示例

package com.xintu.java8;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class XInTuJava8MappingDemo {
    public static void main(String[] args) {
        List<Person> list = Person.getList();
        Map<Integer, String> nameByAge
                = list.stream().collect(Collectors.groupingBy(Person::getAge,
                Collectors.mapping(Person::getName, Collectors.joining(","))));
        nameByAge.forEach((k, v) -> System.out.println("age:" + k + " persons: " + v));
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public static List<Person> getList() {
        List<Person> list = new ArrayList<>();
        list.add(new Person("Tom", 30));
        list.add(new Person("Jack", 20));
        list.add(new Person("LiSa", 20));
        list.add(new Person("Mahesh", 30));
        return list;
    }
} 

执行结果, 

age:20 persons: Jack,LiSa

age:30 persons: Tom,Mahesh

5、Collectors.averagingDouble()

5.1 作用

Collectors.averagingDouble() 方法将流中的所有元素视为 double 类型并计算他们的平均值。该方法返回的是同一个 Collectors 实例,因此可以进行链式操作。 

Collectors.averagingDouble() 接受一个参数,这个参数是一个 lambda 表达式,用于对所有的元素执行一个 map 操作。 

Java 所有集合的 stream().collect() 可以接受一个收集器实例作为其参数并返回该收集器的计算结果。 

例如下面的代码,collect() 方法会把所有的元素收集起来然后传递给 Collectors.averagingDouble(d->d*2) 收集器,对每个元素执行 *2 操作后计算平均值。

5.2 代码示例

package com.xintu.java8;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class XinTuJava8AveragingDoubleExample {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        Double result = list.stream().collect(Collectors.averagingDouble(d -> d * 2));
        System.out.println(result);
    }
}

执行结果:

5.0 

6、Collectors.averagingInt()

6.1 作用

Collectors.averagingInt() 方法和 Collectors.averagingDouble() 一样,不同的是它把流中的所有元素看成是 int 类型,并返回一个浮点类型的平均值。 

6.2 代码示例

package com.xintu.java8;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class XinTuJava8AveragingIntExample {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        Double result = list.stream().collect(Collectors.averagingInt(v -> v * 2));
        System.out.println(result);
    }
}

执行结果 5.0 

7、Collectors.averagingLong()

7.1 作用

Collectors.averagingLong() 方法也和 Collectors.averagingDouble() 类似,不同的是它把流中的所有元素看成是 long 类型,并返回一个 double 类型的平均值。 

7.2 代码示例

package com.xintu.java8;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class XinTuJava8AveragingLongExample {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        Double result = list.stream().collect(Collectors.averagingLong(v -> v * 2));
        System.out.println(result);
    }
}

执行结果

5.0