java8 stream 排序(金钱,日期,年龄),过滤,最大值,最小值。
实体类
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Builder;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@Builder
class Person {
private String name;
private Integer age;
private BigDecimal salary;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
}
排序,过滤,最大值,最小值。
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.stream.Collectors;
public class Java8StreamTest {
/**
* 常用排序手段: 根据date排序, 根据number排序, 根据money排序
*/
public static void testStream() throws ParseException {
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime with = ldt.with(TemporalAdjusters.lastDayOfMonth());
Date date = Date.from(with.atZone(ZoneId.systemDefault()).toInstant());
LocalDateTime parse = LocalDateTime.parse("2021-01-02 21:21:21", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = sdf.parse("2021-01-02 21:32:32");
Date date2 = sdf.parse("2021-07-05 12:32:45");
Date date3 = sdf.parse("2020-09-18 23:21:21");
Date date4 = sdf.parse("2018-05-02 19:23:01");
Date date5 = sdf.parse("2019-11-25 03:54:12");
List<Person> personList = new ArrayList<>();
Person tom = Person.builder()
.name("tom")
.age(38)
.salary(new BigDecimal("11123.00"))
.birthday(date1).build();
Person jerry = Person.builder()
.name("jerry")
.age(25)
.salary(new BigDecimal("6464.00"))
.birthday(date2).build();
Person jack = Person.builder()
.name("jack")
.age(49)
.salary(new BigDecimal("9797.00"))
.birthday(date3).build();
Person rose = Person.builder()
.name("rose")
.age(67)
.salary(new BigDecimal("8098.00"))
.birthday(date4).build();
Person shel = Person.builder()
.name("shel")
.age(52)
.salary(new BigDecimal("94465165.00"))
.birthday(date5).build();
personList.add(tom);
personList.add(tom);
personList.add(jerry);
personList.add(jack);
personList.add(rose);
personList.add(shel);
personList.sort((o1, o2) -> o1.getSalary().compareTo(o2.getSalary()));
System.out.println("根据金钱升序:" + personList);
personList.sort((o1, o2) -> -1 * o1.getSalary().compareTo(o2.getSalary()));
System.out.println("根据金钱降序:" + personList);
personList.sort(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge().compareTo(o2.getAge());
}
});
System.out.println("根据年龄升序:" + personList);
personList.sort(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getBirthday().compareTo(o2.getBirthday());
}
});
System.out.println("根据日期升序:" + personList);
List<Person> collect = personList.stream().distinct().collect(Collectors.toList());
System.out.println("java8根据对象去重:" + collect);
List<Person> collect1 = personList.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
System.out.println("java8根据年龄升序:" + collect1);
List<Person> collect2 = personList.stream().sorted(Comparator.comparing(Person::getSalary).reversed()).collect(Collectors.toList());
System.out.println("java8根据金钱降序:" + collect2);
List<Person> collect3 = personList.stream().distinct().sorted(Comparator.comparing(Person::getBirthday).thenComparing(Person::getSalary)).collect(Collectors.toList());
System.out.println("java8先去重再根据日期排序,再根据年龄排序:" + collect3);
List<Person> collect4 = personList.stream().filter(person -> person.getName() == "tom" || person.getName() == "jerry").collect(Collectors.toList());
System.out.println("java8获取符合条件的变量的对象:" + collect4);
// 相当于获取数据库表的列
List<String> collect5 = personList.stream().map(person -> person.getName() + " - " + person.getAge()).collect(Collectors.toList());
System.out.println("java8获取所有的对象的属性组合:" + collect5);
List<BigDecimal> collect6 = personList.stream().map(person -> person.getSalary()).collect(Collectors.toList());
System.out.println("java8获取所有对象的某个属性(salary):" + collect6);
List<BigDecimal> collect7 = collect6.stream().skip(1).collect(Collectors.toList());
System.out.println("将第一个元素跳过: " + collect7);
BigDecimal max = collect6.stream().max(BigDecimal::compareTo).get();
System.out.println("获取最大的值:" + max);
BigDecimal min = collect6.stream().min(BigDecimal::compareTo).get();
System.out.println("获取最小的值:" + min);
BigDecimal sum = collect6.stream().reduce(BigDecimal::add).get();
System.out.println("获取总和:" + sum);
BigDecimal min2 = collect6.stream().reduce(BigDecimal.valueOf(0), BigDecimal::min);
System.out.println("最小值:" + min2);
BigDecimal max2 = collect6.stream().reduce(BigDecimal.valueOf(0), BigDecimal::max);
System.out.println("最大值:" + max2);
}
public static void main(String[] args) throws ParseException {
testStream();
}
}
输出
根据金钱升序:[Person(name=jerry, age=25, salary=6464.00, birthday=Mon Jul 05 12:32:45 CST 2021), Person(name=rose, age=67, salary=8098.00, birthday=Wed May 02 19:23:01 CST 2018), Person(name=jack, age=49, salary=9797.00, birthday=Fri Sep 18 23:21:21 CST 2020), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=shel, age=52, salary=94465165.00, birthday=Mon Nov 25 03:54:12 CST 2019)]
根据金钱降序:[Person(name=shel, age=52, salary=94465165.00, birthday=Mon Nov 25 03:54:12 CST 2019), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=jack, age=49, salary=9797.00, birthday=Fri Sep 18 23:21:21 CST 2020), Person(name=rose, age=67, salary=8098.00, birthday=Wed May 02 19:23:01 CST 2018), Person(name=jerry, age=25, salary=6464.00, birthday=Mon Jul 05 12:32:45 CST 2021)]
根据年龄升序:[Person(name=jerry, age=25, salary=6464.00, birthday=Mon Jul 05 12:32:45 CST 2021), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=jack, age=49, salary=9797.00, birthday=Fri Sep 18 23:21:21 CST 2020), Person(name=shel, age=52, salary=94465165.00, birthday=Mon Nov 25 03:54:12 CST 2019), Person(name=rose, age=67, salary=8098.00, birthday=Wed May 02 19:23:01 CST 2018)]
根据日期升序:[Person(name=rose, age=67, salary=8098.00, birthday=Wed May 02 19:23:01 CST 2018), Person(name=shel, age=52, salary=94465165.00, birthday=Mon Nov 25 03:54:12 CST 2019), Person(name=jack, age=49, salary=9797.00, birthday=Fri Sep 18 23:21:21 CST 2020), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=jerry, age=25, salary=6464.00, birthday=Mon Jul 05 12:32:45 CST 2021)]
java8根据对象去重:[Person(name=rose, age=67, salary=8098.00, birthday=Wed May 02 19:23:01 CST 2018), Person(name=shel, age=52, salary=94465165.00, birthday=Mon Nov 25 03:54:12 CST 2019), Person(name=jack, age=49, salary=9797.00, birthday=Fri Sep 18 23:21:21 CST 2020), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=jerry, age=25, salary=6464.00, birthday=Mon Jul 05 12:32:45 CST 2021)]
java8根据年龄升序:[Person(name=jerry, age=25, salary=6464.00, birthday=Mon Jul 05 12:32:45 CST 2021), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=jack, age=49, salary=9797.00, birthday=Fri Sep 18 23:21:21 CST 2020), Person(name=shel, age=52, salary=94465165.00, birthday=Mon Nov 25 03:54:12 CST 2019), Person(name=rose, age=67, salary=8098.00, birthday=Wed May 02 19:23:01 CST 2018)]
java8根据金钱降序:[Person(name=shel, age=52, salary=94465165.00, birthday=Mon Nov 25 03:54:12 CST 2019), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=jack, age=49, salary=9797.00, birthday=Fri Sep 18 23:21:21 CST 2020), Person(name=rose, age=67, salary=8098.00, birthday=Wed May 02 19:23:01 CST 2018), Person(name=jerry, age=25, salary=6464.00, birthday=Mon Jul 05 12:32:45 CST 2021)]
java8先去重再根据日期排序,再根据年龄排序:[Person(name=rose, age=67, salary=8098.00, birthday=Wed May 02 19:23:01 CST 2018), Person(name=shel, age=52, salary=94465165.00, birthday=Mon Nov 25 03:54:12 CST 2019), Person(name=jack, age=49, salary=9797.00, birthday=Fri Sep 18 23:21:21 CST 2020), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=jerry, age=25, salary=6464.00, birthday=Mon Jul 05 12:32:45 CST 2021)]
java8获取符合条件的变量的对象:[Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=tom, age=38, salary=11123.00, birthday=Sat Jan 02 21:32:32 CST 2021), Person(name=jerry, age=25, salary=6464.00, birthday=Mon Jul 05 12:32:45 CST 2021)]
java8获取所有的对象的属性组合:[rose - 67, shel - 52, jack - 49, tom - 38, tom - 38, jerry - 25]
java8获取所有对象的某个属性(salary):[8098.00, 94465165.00, 9797.00, 11123.00, 11123.00, 6464.00]
将第一个元素跳过: [94465165.00, 9797.00, 11123.00, 11123.00, 6464.00]
获取最大的值:94465165.00
获取最小的值:6464.00
获取总和:94511770.00
最小值:0
最大值:94465165.00