java8新特性---stream

Stream流API的使用,意在使用java内部迭代来减少代码量,下面总结了一些常用的流方法:

  1. 从数组和集合中创建Java流
// 使用Stream.of()从相似类型的数据创建流
		Stream<Integer> stream1 = Stream.of(1, 2, 3);
		// 使用Stream.of()一个Object数组来返回流
		Stream<Integer> stream2 = Stream.of(new Integer[] { 1, 2, 3, 4 });
		// 使用Collection stream()来创建顺序流并parallelStream()创建并行流
		List<Integer> myList = new ArrayList<>();
		for (int i = 0; i < 100; i++)
			myList.add(i);
		// sequential stream
		Stream<Integer> sequentialStream = myList.stream();
		// parallel stream
		Stream<Integer> parallelStream = myList.parallelStream();

		// 使用Stream.generate()和Stream.iterate()方法来创建Stream
		Stream<String> streamGenerate = Stream.generate(() -> {
			return "abc";
		});
		Stream<String> streamIterate = Stream.iterate("abc", (i) -> i);

		// 使用Arrays.stream()和String.chars()方法
		LongStream is = Arrays.stream(new long[] { 1, 2, 3, 4 });
		IntStream is2 = "abc".chars();
  1. 将Java Stream转换为集合或数组
Stream<Integer> intStream = Stream.of(1, 2, 3, 4);
   	List intList = intStream.collect(Collectors.toList());
   	System.out.println(intList);// prints [1, 2, 3, 4]

   	intStream = Stream.of(1, 2, 3, 4);// stream is closed, so we need to
   										// create it again
   	Map<Integer, Integer> intMap = intStream.collect(Collectors.toMap(i -> i, i -> i + 10));
   	System.out.println(intMap); // prints {1=11, 2=12, 3=13, 4=14}

   	// 使用stream toArray()方法从流中创建一个数组
   	Stream<Integer> intStreamNew = Stream.of(1, 2, 3, 4);
   	Integer[] intArray = intStreamNew.toArray(Integer[]::new);
   	System.out.println(Arrays.toString(intArray));// prints [1, 2, 3, 4]

  1. Java流中间操作
// Stream filter()示例:我们可以使用filter()方法测试条件的流元素并生成过滤列表。
   	List<Integer> myFilterList = new ArrayList<>();
   	for (int i = 0; i < 100; i++)
   		myFilterList.add(i);
   	Stream<Integer> streamList = myFilterList.stream();
   	// filter numbers greater than 90
   	Stream<Integer> stream = streamList.filter(p -> p > 90);

   	System.out.print("High Nums greater than 90=");
   	stream.forEach(p -> System.out.print(p + " "));// prints "High Nums
   													// greater than 90=91 92
   													// 93 94 95 96 97 98 99
   													// "

   	// Stream map()示例:我们可以使用map()将函数应用于流

   	Stream<String> names = Stream.of("aBc", "d", "ef");
   	Stream<String> nameStream = names.map(s -> {
   		return s.toUpperCase();
   	});
   	System.out.println(nameStream.collect(Collectors.toList()));

   	// Stream sorted()示例:我们可以使用sorted()通过传递Comparator参数来对流元素进行排序。

   	Stream<String> names2 = Stream.of("aBc", "d", "ef", "123456");
   	Stream streamDemo = names2.sorted(Comparator.reverseOrder());
   	List reverseOrder = (List) streamDemo.collect(Collectors.toList());
   	System.out.println(reverseOrder);// [ef, d, aBc, 123456]

   	Stream<String> names3 = Stream.of("aBc", "d", "ef", "123456");
   	List<String> naturalSorted = names3.sorted().collect(Collectors.toList());
   	System.out.println(naturalSorted); // [123456, aBc, d, ef]

   	// Stream flatMap()示例:我们可以使用flatMap()从列表流中创建流。让我们看一个清除这个疑问的简单例子
   	Stream<List<String>> namesOriginalList = Stream.of(Arrays.asList("Pankaj"), Arrays.asList("David", "Lisa"),
   			Arrays.asList("Amit"));
   	// flat the stream from List<String> to String stream
   	Stream<String> flatStream = namesOriginalList.flatMap(strList -> strList.stream());
   	flatStream.forEach(System.out::println);

   	/**
   	 * Java流终
  1. Java流终端操作
// Stream reduce()示例:我们可以使用reduce()来使用关联累加函数对流的元素执行减少,并返回Optional
		Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);

		Optional<Integer> intOptional = numbers.reduce((i, j) -> {
			return i * j;
		});
		if (intOptional.isPresent())
			System.out.println("Multiplication = " + intOptional.get()); // 120

		// Stream count()示例:我们可以使用此终端操作来计算流中的项目数。
		Stream<Integer> numbers1 = Stream.of(1, 2, 3, 4, 5);

		System.out.println("Number of elements in stream=" + numbers1.count()); // 5

		// Stream forEach()示例:这可用于迭代流。我们可以用它来代替迭代器

		Stream<Integer> numbers2 = Stream.of(1, 2, 3, 4, 5);
		numbers2.forEach(i -> System.out.print(i + ",")); // 1,2,3,4,5,

		// Stream match()示例
		Stream<Integer> numbers3 = Stream.of(1, 2, 3, 4, 5);
		System.out.println("Stream contains 4? " + numbers3.anyMatch(i -> i == 4));// Stream

		Stream<Integer> numbers4 = Stream.of(1, 2, 3, 4, 5);
		System.out.println("Stream contains all elements less than 10? " + numbers4.allMatch(i -> i < 10));// Stream
																											// contains

		Stream<Integer> numbers5 = Stream.of(1, 2, 3, 4, 5);
		System.out.println("Stream doesn't contain 10? " + numbers5.noneMatch(i -> i == 10));// Stream
																								// doesn't
		// Stream findFirst()示例:这是一个短路终端操作,让我们看看我们如何使用它来从以D开头的流中查找第一个字符串

		Stream<String> names4 = Stream.of("Pankaj", "Amit", "David", "Lisa");
		Optional<String> firstNameWithD = names4.filter(i -> i.startsWith("D")).findFirst();
		if (firstNameWithD.isPresent()) {
			System.out.println("First Name starting with D=" + firstNameWithD.get()); // David
		}

后续会总结其它新特性

发布了47 篇原创文章 · 获赞 18 · 访问量 5721

猜你喜欢

转载自blog.csdn.net/yuruizai110/article/details/88629801