java语法之stream流

Stream的创建

Stream可以通过集合数组创建
1、用集合创建流

List<String> list = Arrays.asList("a","b","c");
//创建一个顺序流
Stream<String> stream = list.stream();
//创建一个并行流
Stream<String> parallelStream = list.parallelStream();

2、用数组创建流

int[] array = {1,3,5,6,8};
IntStream stream = Array.stream(array);

3、使用Stream的静态方法:of()、iterate()、generate()

Stream<Integer> stream = Stream.of(1,2,3,4,5,6);

Stream<Integer> stream2 = Stream.iterate(0,(x) -> x + 3).limit(4);
stream2.forEach(System.out::println);

Stream<Double> stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println);

总结:

stream为顺序流,由主线程按顺序对流执行操作;
parallelStream是并行流,内部以多线程并行的方式对流进行操作,前提是流中的数据处理没有顺序要求。
如下:筛选集合中的奇数
java语法之stream流_第1张图片
可以发现如果数据量大的话,并行流的效率更高。
除了直接创建并行流,还可以通过parallel()把顺序流转换成并行流:

Optional<Integer> findFirst = list.stream().parallel().filter(x -> x > 6).findFirst();

Stream的试用

首先要明白Optional

Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。

案例使用的员工类
员工类:

List<Person> personList = new ArrayList<Person>();
personList.add(new Person("Tom", 8900, "male", "New York"));
personList.add(new Person("Jack", 7000, "male", "Washington"));
personList.add(new Person("Lily", 7800, "female", "Washington"));
personList.add(new Person("Anni", 8200, "female", "New York"));
personList.add(new Person("Owen", 9500, "male", "New York"));
personList.add(new Person("Alisa", 7900, "female", "New York"));

class Person {
	private String name;  // 姓名
	private int salary; // 薪资
	private int age; // 年龄
	private String sex; //性别
	private String area;  // 地区

	// 构造方法
	public Person(String name, int salary, int age,String sex,String area) {
		this.name = name;
		this.salary = salary;
		this.age = age;
		this.sex = sex;
		this.area = area;
	}
	// 省略了get和set,请自行添加

}

1、遍历/匹配(foreach/find/match)

Stream也是支持类似集合的遍历和匹配元素的,只是Stream中的元素是以Optional类型存在的。Stream的遍历、匹配非常简单。
java语法之stream流_第2张图片

public class StreamTest {
	public static void main(String[] args) {
        List<Integer> list = Arrays.asList(7, 6, 9, 3, 8, 2, 1);

        // 遍历输出符合条件的元素
        list.stream().filter(x -> x > 6).forEach(System.out::println);
        // 匹配第一个
        Optional<Integer> findFirst = list.stream().filter(x -> x > 6).findFirst();
        // 匹配任意(适用于并行流)
        Optional<Integer> findAny = list.parallelStream().filter(x -> x > 6).findAny();
        // 是否包含符合特定条件的元素
        boolean anyMatch = list.stream().anyMatch(x -> x > 6);
        System.out.println("匹配第一个值:" + findFirst.get());
        System.out.println("匹配任意一个值:" + findAny.get());
        System.out.println("是否存在大于6的值:" + anyMatch);
    }
}

2、筛选(filter)

筛选,是按照一定的规则校验流中的元素,将符合条件的元素提取到新的流中的操作。
java语法之stream流_第3张图片
案例一:筛选出Integer集合中大于7的元素,并打印。

public class StreamTest {
	public static void main(String[] args) {
		List<Integer> list = Arrays.asList(6, 7, 3, 8, 1, 2, 9);
		Stream<Integer> stream = list.stream();
		stream.filter(x -> x > 7).forEach(System.out::println);
	}
}

例二:筛选出员工工资高于8000的人,并形成新的集合。形成新的集合依赖collect(收集)

public class StreamTest {
	public static void main(String[] args) {
		List<Person> personList = new ArrayList<Person>();
		personList.add(new Person("Tom", 8900, 23, "male", "New York"));
		personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
		personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
		personList.add(new Person("Anni", 8200, 24, "female", "New York"));
		personList.add(new Person("Owen", 9500, 25, "male", "New York"));
		personList.add(new Person("Alisa", 7900, 26, "female", "New York"));

		List<String> fiterList = personList.stream().filter(x -> x.getSalary() > 8000).map(Person::getName)
				.collect(Collectors.toList());
		System.out.print("薪资高于8000美元的员工:" + fiterList);
	}
}

结果:

薪资高于8000美元的员工:[Tom, Anni, Owen]

聚合(max/min/count)

用来进行数据统计。
java语法之stream流_第4张图片
例一:获取String集合中最长的元素。

public class StreamTest{
	public static void main(String[] args){
		List<String> list = Arrays.asList("adnm","admmt","pot","xbangd","weoujgsd");
		Optional<String> max = list.stream().max(Comparator.comparing(String::length));
		System.out.println("最长的字符串:" + max.get());
	}
}

输出结果:

最长的字符串:weoujgsd

例二:获取Integer集合中的最大值。

public class StreamTest {
	public static void main(String[] args){
		List<Integer> list = Arrays.asList(7,6,9,4,11,6);
	//自然排序
	Optional<Integer> max = list.stream().max(Integer::compareTo);
	//自定义排序(从大到小排序)
	Optional<Integer> max2 = list.stream().max((o1, o2) -> o2 - o1);
	System.out.println("自然排序的最大值:" + max.get());
	System.out.println("自定义排序的最大值:" + max2.get());
	}
}

输出结果:

自然排序的最大值:11
自定义排序的最大值:4

例三:获取员工薪资最高的人。

public class StreamTest {
	public static void main(String[] args) {
	List<Person> personList = new ArrayList<Person>();
		personList.add(new Person("Tom", 8900, 23, "male", "New York"));
		personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
		personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
		personList.add(new Person("Anni", 8200, 24, "female", "New York"));
		personList.add(new Person("Owen", 9500, 25, "male", "New York"));
		personList.add(new Person("Alisa", 7900, 26, "female", "New York"));
		
		Optional<Person> max = personList.stream().max(Comparator.comparingInt(Person::getSalary));
		System.out.println("员工薪资最大值:" + max.get().getSalary());

输出结果:

员工薪资最大值:9500

例四:计算Integer集合中大于6的元素的个数。

import java.util.Arrays;
import java.util.List;

public class StreamTest {
	public static void main(String[] args) {
		List<Integer> list = Arrays.asList(7, 6, 4, 8, 2, 11, 9);

		long count = list.stream().filter(x -> x > 6).count();
		System.out.println("list中大于6的元素个数:" + count);
	}
}

输出结果:

list中大于6的元素个数:4

映射(map/flatMap)

映射,可以将一个流的元素按照一定的映射规则映射到另一个流中。分为map和flatMap:
map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
java语法之stream流_第5张图片
例一:英文字符串数组的元素全部改为大写。整数数组每个元素+3

public class StreamTest {
	public static void main(String[] args) {
		String[] strArr = {"abcd","bcdd","defde","fTr"};
		List<String> strList = 	Arrays.stream(strArr).map(String::toUpperCase).collect(Collectors.toList());

		List<Integer> intList = Arrays.asList(1,3,5,7,9,11);
		List<Integer> intListNew = intList.stream().map(x -> x +3).collect(Collectors.toList());
		
		System.out.println("每个元素大写:" + strList);
		System.out.println("每个元素+3:" + intListNew);
	}
}

输出结果:

每个元素大写:[ABCD,BCDD,DEFDE,FTR]
每个元素+3:[4,6,8,10,14]

例二:将员工的薪资全部增加1000

public class StreamTest {
	public static void main(String[] args) {
		List<Person> personList = new ArrayList<Person>();
		personList.add(new Person("Tom", 8900, 23, "male", "New York"));
		personList.add(new Person("Jack", 7000, 25, "male", "Washington"));
		personList.add(new Person("Lily", 7800, 21, "female", "Washington"));
		personList.add(new Person("Anni", 8200, 24, "female", "New York"));
		personList.add(new Person("Owen", 9500, 25, "male", "New York"));
		personList.add(new Person("Alisa", 7900, 26, "female", "New York"));

		//不改变原来员工集合的方式
		List<Person> personListNew = personList.stream().map(person -> {
		Person personNew = new Person(person.getName(), 0, 0, null, null);
		personNew.setSalary(person.getSalary() + 1000);
		return personNew;
 }).collect(Collectors.toList());
 		System.out.println("一次改动前:" + personList.get(0).getName() + "-->" + personList.get(0).getSalary());
 		System.out.println("一次改动后:" + personListNew.get(0).getName() + "-->" + personListNew.get(0).getSalary());

		//改变原来员工集合的方式
		List<Person> personListNew2 = personList.stream().map(person -> {
			person.setSalary(person.getSalary() + 1000);
			return person;
		}).collect(Collectors.toList());
		System.out.println("二次改动前:" + personList.get(0).getName() + "-->" + personListNew.get(0).getSalary());
		System.out.println("二次改动后:" + personListNew2.get(0).getName() + "-->" + personListNew.get(0).getSalary());

输出结果:

一次改动前:Tom–>8900
一次改动后:Tom–>18900
二次改动前:Tom–>18900
二次改动后:Tom–>18900

你可能感兴趣的:(java,servlet,开发语言)