package com.example.jdk8demo;
import com.example.jdk8demo.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@SpringBootTest
class Jdk8DemoApplicationTests {
/*测试lambda 表达式*/
@Test
public void lambdaTest(){
//遍历集合并输出
Arrays.asList( "a", "b", "d" ).forEach(e -> System.out.println( e ) );
System.out.println("------------------------------------------------------------");
//指定元素的类型,并遍历输出
Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );
System.out.println("------------------------------------------------------------");
//遍历集合后进行复杂的逻辑处理,使用{} 进行封装
Arrays.asList( "a", "b", "d" ).forEach( e -> {
if (e.equals("a")){
System.out.println("是a");
}
} );
System.out.println("------------------------------------------------------------");
//Lambda表达式可以引用类成员和局部变量(会将这些变量隐式得转换成final的),会将 separator变量 在lambda表达式中变为final
String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach(
( String e ) -> System.out.print( e + separator ) );
System.out.println("------------------------------------------------------------");
//Lambda表达式有返回值,返回值的类型也由编译器推理得出。如果Lambda表达式中的语句块只有一行,则可以不用使用return语句
Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );
//等价于
/*Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> {
int result = e1.compareTo( e2 );
return result;
} );
*/
}
@Test
public void streamTest(){
List<User> userList = Arrays.asList(
new User("用户1", 16, 0),
new User("用户2", 17, 1),
new User("用户3", 18, 0),
new User("用户4", 19, 1),
new User("用户5", 20, 0),
new User("用户6", 21, 1),
new User("用户7", 22, 0)
);
//获取流并进行集合set化,然后遍历输出
userList.stream().collect(Collectors.toSet()).forEach(System.out::println);
System.out.println("------------------------------------------------------------");
//获取流,filter 遍历集合,根据->后的逻辑获取对应的过滤的集合,然后使用collect进行集合化,最后遍历输出
userList.stream().filter(user -> user.getAge()>18 && user.getSex().equals(0)).collect(Collectors.toSet()).forEach(System.out::println);
System.out.println("------------------------------------------------------------");
/*map()方法的参数为Function(函数式接口)对象,
map()方法将流中的所有元素用Function对象进行运算,生成新的流对象(流的元素类型可能改变)。*/
List<Integer> numbers = Arrays.asList(-1, -2, 0, 4, 5);
numbers.stream().map( n -> Math.abs(n)).forEach(n -> System.out.println("Element abs: " + n));
System.out.println("------------------------------------------------------------");
/*flatMap 和 map 的区别*/
List<String> list = Arrays.asList("1 2", "3 4", "5 6");
list.stream().flatMap(item -> Arrays.stream(item.split(" "))).forEach(System.out::println);
list.stream().map(item -> Arrays.stream(item.split(" "))).forEach(n ->n.forEach(System.out::println));
System.out.println("------------------------------------------------------------");
/*reduce 累加器*/
List<Integer> numbers1 = Arrays.asList(-1, -2, 0, -1, 4, 5, 1);
Integer total = numbers1.stream().reduce((t, n) -> t + n).get();
System.out.println("Total: " + total);
System.out.println("------------------------------------------------------------");
/*collect方法*/
numbers1.stream().collect(Collectors.toCollection(ArrayList::new)).forEach(System.out::println);
System.out.println("------------------------------------------------------------");
/*limit 限制输出的个数为2*/
numbers1.stream().filter(n -> n>0).limit(2).forEach(System.out::println);
System.out.println("------------------------------------------------------------");
/*sorted 进行排序*/
numbers1.stream().sorted().forEach(System.out::println);
System.out.println("------------------------------------------------------------");
/*sorted 使用compare 方法进行排序,变换两个变量的位置可实现正序和倒序*/
numbers1.stream().sorted((o1,o2)->o1.compareTo(o2)).forEach(System.out::println);
System.out.println("------------------------------------------------------------");
numbers1.stream().sorted((o1,o2)->o2.compareTo(o1)).forEach(System.out::println);
System.out.println("------------------------------------------------------------");
/*map 中的Function 函数式接口,一个参数,一个返回值*/
numbers1.stream().map(t->t+=2).forEach(System.out::println);
}
}
评论1