java8 流式编程Stream、Collector

1、随机展示 1 至 50 之间不重复的整数并进行排序。实际上,你的关注点首先是创建一个有序集合。使用流式编程,你就可以简单的这样做:

public static void main(String[] args) {
    new Random(47)
            .ints(1, 50)
            .distinct()
            .limit(7)
            .sorted()
            .forEach(System.out::println);
}
有Java基础的伙伴们看到后可能会心一笑!这么简洁啊。

首先,我们给 Random 对象一个种子   ints() 方法产生一个流并且 ints() 方法产生一个整数流。 distinct() 来获取它们的非重复值,然后使用 limit() 方法获取前 7 个元素。sorted() 方法排序。最终使用 forEach() 方法遍历输出,它根据传递给它的函数对每个流对象执行操作。我们传递了一个可以在控制台显示每个元素的方法引用。System.out::println 相当于System.out.println (),这是Java函数式编程思想的一种体现,以后会详细解读Java函数式编程。

2、每个集合可以通过调用 stream() 方法来产生一个流

public static void main(String[] args) {
    Set<String> w = new HashSet<>(Arrays.asList("You are a good student!".split(" ")));
    w.stream().map(x -> x + " ").forEach(System.out::print);
    System.out.println("...........");
 
    Map<String, Double> m = new HashMap<>();
    m.put("a", 9.9);
    m.put("b", 26.8);
    m.put("c", 1.0);
    m.entrySet().stream().map(e -> e.getKey() + ": " + e.getValue()).forEach(System.out::println);
}
输出结果:
 
a are student! good You ...........
a: 9.9
b: 26.8
c: 1.0
所有集合  如 上w、  m  都有的 stream()方法,然后 map() 会获取流中的所有元素,并且对流中元素进行操作从而产生新的元素,并将其传递到流中。通过map() 会获取对象并产生新的对象,但是这里有特殊版本的方法用于数值类型的流。例如,mapToInt() 方法将一个对象流(objects stream)转换成为包含整形数字的 IntStream。同样,针对 String 和 Double 也有类似名字的操作。

为了从 Map 集合中产生流数据,我们首先调用 entrySet() 去产生一个对象流,每个对象都包含一个 key 键以及与其相关联的 value 值。然后调用 getKey() 和 getValue() 将其分开遍历。

3、使用 Collectors 类来收集元素到特定的结果集合中 如:tocollect() 、.toCollection()、.toMap()等

public static void main(String[] args) {
    List<String> fileToWords = new ArrayList<>();
    fileToWords.add("nandao");
    fileToWords.add("nandao");
    fileToWords.add("ytao");
    fileToWords.add("mage");
    ArrayList<String> words =
            fileToWords.stream()
                    .collect(ArrayList::new,
                            ArrayList::add,
                            ArrayList::addAll);
    words.stream()
            .filter(s -> s.equals("nandao")).collect(Collectors.toList())
            .forEach(System.out::println);
}
输出结果:
 
nandao
nandao
这里有两个重要的语法:

A、collect(Collector):使用 Collector 来累计流元素到结果集合中,如:collect(Collectors.toList())  源码如下:

B、collect(Supplier, BiConsumer, BiConsumer):同上,但是 Supplier 创建了一个新的结果集合,第一个 BiConsumer是将下一个元素包含在结果中的函数,而第二个 BiConsumer 是用于将两个值组合起来,源码如下:

public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值