Java8-Stream流操作(一)

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));

    }

}

执行结果:

A

B

C

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_49219837

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值