User实体类:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
@Data
@AllArgsConstructor
@ToString
public class User {
private String name;
private int age;
}
测试类:
@SpringBootTest
class DemoApplicationTests {
List<User> list = Arrays.asList(
// name,age
new User("张三", 11),
new User("王五", 20),
new User("王五", 91),
new User("张三", 8),
new User("李四", 44),
new User("李四", 44),
new User("李四", 44)
);
@Test
void contextLoads() {
}
/**
* forEach遍历
*/
@Test
public void testForEach(){
// java 8 前
System.out.println("java 8 前");
for(User user: list){
System.out.println(user);
}
// java 8 lambda
System.out.println("java 8 lambda");
list.forEach(user -> System.out.println(user));
// java 8 stream lambda
System.out.println("java 8 stream lambda");
list.stream().forEach(user -> System.out.println(user));
}
/**
* sorted对Stream中元素按指定规则进行排序
*/
@Test
public void testSort(){
System.out.println("排序前");
list.forEach(user -> System.out.println(user));
System.out.println("排序后");
System.out.println("java 8 前");
Collections.sort(list, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o1.getAge()-o2.getAge();
}
});
for (User user : list) {
System.out.println(user);
}
System.out.println("java 8 stream 方法引用");
list.stream().sorted(Comparator.comparing(User::getAge)).forEach(user -> System.out.println(user));//从小到大排序
list.stream().sorted(Comparator.comparing(User::getAge).reversed()).forEach(user -> System.out.println(user));//从大到小排序
}
@Test
public void testFilter(){
System.out.println("过滤前");
list.forEach(user -> System.out.println(user));
System.out.println("过滤后");
System.out.println("java前");
for (User user : list) {
if(user.getAge()>50){
System.out.println(user);
}
}
System.out.println("java 8 stream");
list.stream().filter(user -> user.getAge()>50).forEach(user -> System.out.println(user));
}
/**
* 从Stream中获取指定数量的元素
*/
@Test
public void testLimit(){
System.out.println("截断前");
list.forEach(user -> System.out.println(user));
System.out.println("截断后");
System.out.println("java 8 前");
for(int i=0;i<3;i++){
System.out.println(list.get(i));
}
System.out.println("java 8 stream");
list.stream().limit(3).forEach(user -> System.out.println(user));
}
/**
* skip 跳过.
*/
@Test
public void testSkip() {
// 跳过前三个元素,从第四个开始输出
System.out.println("-----跳过前-----");
list.forEach(user -> System.out.println(user));
System.out.println("-----跳过后-----");
// java 8 前
System.out.println("java 8 前");
for (int i = 3; i < list.size(); i++) {
System.out.println(list.get(i));
}
// java 8 stream
System.out.println("java 8 stream");
list.stream().skip(3).forEach(user -> System.out.println(user));
}
/**
* distinct 去重.
*/
@Test
public void testDistinct() {
// 因为Arrays.asList() 返回的是Arrays的内部类ArrayList,操作remove,add会报错
List<User> users = new ArrayList(list);
// 为list去除重复数据
System.out.println("-----去重前-----");
list.forEach(user -> System.out.println(user));
System.out.println("-----去重后-----");
// java 8 前
System.out.println("java 8 前");
for (int i = 0; i < users.size() - 1; i++) {
for (int j = users.size() - 1; j > i; j--) {
if (users.get(j).getAge() == users.get(i).getAge() && users.get(j).getName()
.equals(users.get(i).getName())) {
users.remove(i);
}
}
}
for (User user : users) {
System.out.println(user);
}
// java 8 stream
System.out.println("java 8 stream");
users.stream().distinct().forEach(user -> System.out.println(user));
}
/**
* 去重+按照年龄大于40以后从小到大+只取前二
*/
@Test
public void demo(){
list.stream().distinct().filter(user -> user.getAge()>40).limit(2).sorted(Comparator.comparing(User::getAge)).forEach(user -> System.out.println(user));
}
/**
* 测试计算.
*/
@Test
public void testNum(){
IntSummaryStatistics num = list.stream().mapToInt(user -> user.getAge())
.summaryStatistics();
System.out.println("总共人数:"+num.getCount());
System.out.println("平均年龄:" + num.getAverage());
System.out.println("最大年龄:" + num.getMax());
System.out.println("最小年龄:" + num.getMin());
System.out.println("年龄之和:" + num.getSum());
}
/**
* map映射
*/
@Test
public void testMap(){
//只要输出所有人的年龄
list.stream().forEach(user -> System.out.println(user));
System.out.println("映射后");
List<Integer> ages= list.stream().map(user -> user.getAge()).collect(toList());
ages.forEach(age -> System.out.println(age));
//小写转大写
List<String>words = Arrays.asList("aaa","vvvv","cccc");
System.out.println("全部大写----》");
List<String>collect = words.stream().map(s ->s.toUpperCase()).collect(toList());
collect.forEach(s -> System.out.println(s));
}
/**
* flatMap
*/
@Test
public void testFlatMap(){
//创建一个 装有两个泛型为integer的集合
Stream<List<Integer>> stream = Stream.of(Arrays.asList(1,2,3),Arrays.asList(4,5));
//将两个合成一个
Stream<Integer> integerStream = stream.flatMap((Function<List<Integer>,Stream<Integer>>)
integers ->integers.stream());
//为新的集合
List<Integer> collect = integerStream.collect(toList());
System.out.println("新stream大小:"+collect.size());
System.out.println("-----合并后-----");
collect.forEach(o -> System.out.println(o));
}
/**
* findFirst
*/
@Test
public void testFindFist(){
User user = list.stream().findFirst().get();
System.out.println(user);
}
/**
* reduce操作可以实现从一组元素中生成一个值
*/
@Test
public void reduce(){
Optional<User>max = list.stream().reduce((s1,s2) ->s1.getAge() >s2.getAge() ?s1:s2);
User user = max.get();
System.out.println(user);
// 求年龄之和
Integer reduce = list.stream().reduce(0, // 该参数为初始值
(integer, user1) -> integer + user1.getAge(), // 该参数为累加器,新元素如何累加
(integer, integer2) -> integer + integer2);// 多个部分如何合并
System.out.println(reduce);
}
/**
* collect
* 引用静态方法 Integer::sum
* 引用某个对象的方法 list::add
* 引用某个类的方法 String::length
* 引用构造方法 HashMap::new
*/
@Test
public void collect(){
// 将Stream转换成List或Set
Stream<String> stream = Stream.of("I", "love", "you", "too");
//List<String> list = stream.collect(Collectors.toList());
//Set<String> set = stream.collect(Collectors.toSet());
// 使用toCollection()指定规约容器的类型
//ArrayList<String> arrayList = stream.collect(Collectors.toCollection(ArrayList::new));
//HashSet<String> hashSet = stream.collect(Collectors.toCollection(HashSet::new));
// 使用Collectors.joining()拼接字符串
//String joined = stream.collect(Collectors.joining());// "Iloveyoutoo"
//String joined = stream.collect(Collectors.joining(","));// "I,love,you,too"
String joined = stream.collect(Collectors.joining(",", "{", "}"));// "{I,love,you,too}"
System.out.println(joined);
}
}