java8之工具类Stream

Stream的出现是为了让java支持函数式编程,从而使得写出的代码更加的紧凑可读。

public class MyStream {

	//stream的中间处理函数和终极处理函数
	//stream的中间处理函数会继续返回stream
	//stream的终极处理函数会处理集合里面的数据,返回最终的结果
	@Test
	public void test1() {
		final Collection<Task> tasks = generateTasks();
		
		int sumCount = tasks.stream()
		    .filter(task -> task.getStatus() == Status.OPEN) //中间函数
		    .mapToInt(Task::getPoints)  //中间函数
		    .sum();  //终极函数
		
		System.out.println(sumCount);
	}

	private Collection<Task> generateTasks() {
		final Collection<Task> tasks = Arrays.asList(
				new Task(Status.OPEN, 5),
				new Task( Status.OPEN, 8 ),
			    new Task( Status.CLOSED, 10 ) 
		);
		return tasks;
	}
	
	//stream 并行处理
	//类似于MapReduce变成模型,多个map并行处理,最终由reduce做聚合处理
	@Test
	public void test2() {
		final Collection<Task> tasks = generateTasks();
		
		int sumNum = tasks
		    .stream()
		    .parallel()
		    .map(task -> task.getPoints())
		    .reduce(0, Integer::sum);
		
		System.out.println(sumNum);
	}
	
	//集合元素分组1
	@Test
	public void test3() {
		final Collection<Task> tasks = generateTasks();
		
		final Map< Status, List< Task > > map = tasks
				.stream()
				.collect(Collectors.groupingBy(Task::getStatus));
		
		System.out.println(map);
	}
	
	//集合元素分组2
	@Test
	public void test4() {
		final Collection<Task> tasks = generateTasks();
		
		int countValue = 23;
		
		final Collection< String > result = tasks
				.stream()
				.mapToInt(Task::getPoints)
				.asLongStream()
				.mapToDouble(points -> (double)points / countValue)
				.boxed()
				.mapToLong(weight -> (long) (weight * 100))
				.mapToObj( percent -> String.valueOf(percent) + "%")
				.collect(Collectors.toList());
				
		System.out.println(result);
	}
	
	// 响应式变成,处理文件读取行
	@Test
	public void test5() {
		String filename = "xx";
		final Path path = new File( filename ).toPath();
		try (Stream<String> lines =Files.lines(path, StandardCharsets.UTF_8)) {
			lines.onClose( () -> System.out.println("Done!") ).forEach( System.out::println );
		} catch (Exception ex) {
			System.out.println(ex);
		}
	}
	
	private enum Status {
		CLOSED, OPEN
	}

	private static final class Task {
		private final Status status;
		private final Integer points;

		Task(final Status status, final Integer points) {
			this.status = status;
			this.points = points;
		}

		public Integer getPoints() {
			return points;
		}

		public Status getStatus() {
			return status;
		}

		@Override
		public String toString() {
			return String.format("[%s, %d]", status, points);
		}
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值