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进行转换。

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

时间: 2024-11-05 14:54:40

Java 8 stream try的相关文章

Java学习记录(补充八:Date类;Java流(Stream),文件(File)和IO)

Date类,Calendar类package Box1; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Random; //Date类 public class DateTest { public static void main(String[] args) { Date

[Java 8 Lambda] java.util.stream 简介

包结构如下所示: 这个包的结构很简单,类型也不多. BaseStream接口 所有Stream接口类型的父接口,它继承自AutoClosable接口,定义了一些所有Stream都具备的行为. 因为继承自AutoClosable接口,所以所有的Stream类型都可以用在Java 7中引入的try-with-resource机制中,以达到自动关闭资源的目的.实际上,只有当Stream是通过Socket,Files IO等方式创建的时候,才需要关闭它.对于来自于Collections,Arrays的S

Java 8 Stream 用法

一.Stream是什么 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator.原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作:高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”.“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换.Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍

java之stream(jdk8)

一.例子 import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; /** * Created by root on 16-5-19. */ public class StreamTest { /** * 集合中不小于50的数输出出来[1, 20, 63, 58, 185, 60, 59, 20] */ private st

Java 8 Stream API具体解释

Java 8 Stream API具体解释 一.Stream API介绍 Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStream是全然不同的概念,它不同于StAX对XML解析的Stream,也不同于Amazon Kinesis对大数据实时处理的Stream.Stream API更像具有Iterable的集合类,但行为和集合类又有所不同,它是对集合对象功能的增强.专注于对集合对象进行各种非常便捷.高效的聚合操作或大批量数

Java 8 Stream API详解

Java 8 Stream API详解 一.Stream API介绍 Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStream是完全不同的概念,它不同于StAX对XML解析的Stream,也不同于Amazon Kinesis对大数据实时处理的Stream.Stream API更像具有Iterable的集合类,但行为和集合类又有所不同,它是对集合对象功能的增强,专注于对集合对象进行各种非常便捷.高效的聚合操作或大批量数据操

Java IO Stream

ref: http://www.studytonight.com/java/java-io-stream.php IO Stream Java performs I/O through Streams. A stream is linked to physical layer by java I/O system to make input and output operation in java. In general, a stream means continuous flow of da

Java流(Stream)、文件(File)和IO

Java流(Stream).文件(File)和IO Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多种格式,比如:基本类型.对象.本地化字符集等等. 一个流可以理解为一个数据的序列.输入流表示从一个源读取数据,输出流表示向一个目标写数据. Java为I/O提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中. 但本节讲述最基本的和流与I/O相关的功能.我们将通过一个个例子来学习这些功能. 读取控制台输入 Jav

[Java 8 Lambda] java.util.stream 简单介绍

包结构例如以下所看到的: 这个包的结构非常easy,类型也不多. BaseStream接口 全部Stream接口类型的父接口,它继承自AutoClosable接口,定义了一些全部Stream都具备的行为. 由于继承自AutoClosable接口,所以全部的Stream类型都能够用在Java 7中引入的try-with-resource机制中,以达到自己主动关闭资源的目的.实际上,仅仅有当Stream是通过Socket,Files IO等方式创建的时候,才须要关闭它.对于来自于Collection