Java 8 stream try

由于工程有一个需求,什么需求? 恩,就是需要将一个iterable 在多核状态下运行。现在已有的方案是,wrapper iterable,即对Iterable进行封装,将iterable 对象作为封装类的私有成员,然后为其写一个 Synchronized method 或者 Synchronized block,实现对next()函数的唯一访问权。这里推荐 Synchronized block,因为前者会带来Dos 问题(怎么会?在文章里有说明)

class A
{
   Iterable<T> iter;
    prive Object lock;public next()
    {
      T result;
      Synchronized(lock)
        
        {
               T= iter.hasnext()? iter.next(): null;
        }
            return T;
   } }

上述代码中可能存在语法错误的,但大致意思表达到了,时间有限,后期补充。

但是,上述问题只是解决了多线程下iterable的线程安全。没有解决多核同时访问itreable 这个问题。用google搜了一下,很多都推荐使用 java 8 的stream的parallel。懵啊。。。好吧,开始学习stream是什么鬼东西。

首先,利用睡前一个小时的时间,中英文blogs同时出发,看了一下大概,明白了stream 的数据来源、中间转换和终止状态问题。大致明白了怎么回事。但是一直纠结,可不可以用自己定义的类型(class),可不可以使用自己定义的函数,怎么使用? 睡前想了想,总结前面看mvn的经验——不能一直看网上的blog 介绍,因为不成系统,只能做到管中窥象,不能对其形成整体认知,得看官方manual或者教科书。放心的睡去。然而,清早起床发现,网上根本没有这类资料。好吧,重新看blogs,同时,根据自己的需要,开始编写一些简单的程序。上程序:

// stream_hello.java 
//package com.mkyong.java8; import java.util.stream.Collectors; import java.util.Arrays; import java.util.Map; import java.util.List; import java.util.function.Function; import java.util.Collection; public class stream_hello { private static final class Task { private final Integer points; Task(final Integer points) { this.points=points; } public Integer getPoints() { System.out.println("threadId="+Thread.currentThread().getId()+ " "+points); return points; } public Integer println() { System.out.println(); return points; } public String toString() { return String.format("[%d]",points); } } public static void main(String [] args) { System.out.println("single thread stream-List"); List<String> items=Arrays.asList("apple","apple","banana","apple","orange","banana","papaya"); Map<String, Long> result=items.stream().collect(Collectors.groupingBy(Function.identity(),Collectors.counting())); System.out.println(result); System.out.println(); System.out.println("single thread stream-Task"); final Collection<Task> tasks=Arrays.asList( new Task(5), new Task(4), new Task(5)); final long totalPoint=tasks .stream() .filter(Task-> Task.getPoints() >4) .filter(Task->Task.println()>4) .mapToInt(Task::getPoints) .sum(); System.out.println("Total points:"+totalPoint); System.out.println(); System.out.println("Multi thread "); final Collection<Task> tasks2=Arrays.asList( new Task(5), new Task(4), new Task(5)); final long totalPoint2=tasks2 .stream() .parallel() .map(Task->Task.getPoints()) .reduce(0,Integer::sum); System.out.println("Total points:"+totalPoint2); System.out.println(); } }

  编译如下: javac stream_example.java   得到 stream_example.class

  运行如下: java stream_example

运行结果:

single thread stream-List
{papaya=1, orange=1, banana=2, apple=3}

single thread stream-Task
threadId=1  5

threadId=1  5
threadId=1  4
threadId=1  5

threadId=1  5
Total points:10

Multi thread
threadId=10  5
threadId=9  5
threadId=1  4
Total points:14

 通过上述代码,有对string进行stream,对自己定义的类作为元素进行stream, 对自己定义的类作为元素进行多核stream。

 我当前的认知如下: 可以自己定义元素,定义元素的数据成员,定义元素的方法,该方法的返回结果可以作为filter,map等函数的参考标准。

  filter、map等函数都是根据一定条件对stream进行转换。

 注意: stream parallel 的多核采用的是fork/join poll.  

 PS:鉴于一些知识,我想和大家分享。所以,以后有些blogs我会发表在随笔中。

 

转载于:https://www.cnblogs.com/xingzifei/p/6048452.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值