在日常的开发工作中经常需要用到list的相关操作,例如遍历,排序,筛选,替换等操作,今日也学习并认识到了list流的一些基础操作,在这里总结一下常用的操作。
Stream
首先来认识一下stream 在java8中stream提供了很多Api,通过这些Api以及Lamda表达式可以进行许多高效并且遍历的操作
创建stream流
创建流有四种方式,具体使用如下:
@Test
public void create1(){
Stream<Person> stream = personList.stream();
Stream<Person> personStream = personList.parallelStream();
}
@Test
public void create2(){
Stream<Person> stream = Arrays.stream(personArr);
}
@Test
public void create3(){
Stream<Person> stream = Stream.of(new Person("emp1", "1"), new Person("emp2", "2"));
}
@Test
public void create4(){
Stream.iterate(0,n -> n+1);
Stream.generate(Math::random);
}
中间操作
筛选操作
@Test
public void operate1(){
Stream<Person> stream = personList.stream().filter(e -> e.getSex().equals("1"));
}
@Test
public void operate2(){
Stream<Person> stream = personList.stream().limit(1);
}
@Test
public void operate3(){
Stream<Person> stream = personList.stream().skip(1);
}
@Test
public void operate4(){
Stream<Person> stream = personList.stream().distinct();
}
映射操作
@Test
public void operate5(){
Stream<String> stream = personList.stream()
.filter(e -> e.getName().contains("2"))
.map(Person::getName);
}
排序操作
@Test
public void operate6(){
List<Integer> intList = Arrays.asList(1, 2, 5, 4, 3);
intList.stream().sorted().forEach(System.out::println);
List<Employee> employees = Arrays.asList(new Employee("员工一", 35, 5000.31),
new Employee("员工二", 30, 8000.31),
new Employee("员工三", 30, 5000.00));
employees.stream().sorted((e1,e2) ->{
int ageCompare = Integer.compare(e1.getAge(),e2.getAge());
if(ageCompare != 0){
return ageCompare;
}else{
return Double.compare(e1.getSalary(),e2.getSalary());
}
}).forEach(System.out::println);
}
终止操作
为什么需要终止操作呢? 因为stream是惰性的,我们前面所用到的中间操作实际上是没有进行的,只有我们进行了终止操作也就是意味着我们需要最终结果的时候,才会去执行相关的中间操作,因此,我们通过stream流操作数据时,终止操作时必不可少的。
匹配、查找
@Test
public void end1(){
boolean allMatch = employees.stream().allMatch(e -> e.getAge() > 30);
}
@Test
public void end2(){
boolean anyMatch = employees.stream().anyMatch(e -> e.getAge() == 30);
}
@Test
public void end3(){
boolean noneMatch = employees.stream().noneMatch(e -> e.getAge() < 18);
}
@Test
public void end4(){
Optional<Employee> first = employees.stream().findFirst();
Optional<Employee> any = employees.stream().findAny();
}
@Test
public void end5(){
long count = employees.stream().count();
Optional<Employee> max = employees.stream()
.max((e1, e2) -> Integer.compare(e1.getAge(), e2.getAge()));
Optional<Employee> min = employees.stream()
.min((e1,e2) -> Integer.compare(e1.getAge(),e2.getAge()));
}
@Test
public void end6(){
employees.stream().forEach(System.out :: println);
}
规约
@Test
public void reduce1(){
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Integer reduce = list.stream().reduce(5, Integer::sum);
Optional<Double> optional = employees.stream().map(e -> e.getSalary()).reduce(Double::sum);
}
收集
@Test
public void collect1(){
List<Employee> list = employees.stream().collect(Collectors.toList());
Set<Employee> set = employees.stream().collect(Collectors.toSet());
}
|