juc

LongAdder VS AtomicLong

推荐使用LongAdder(采用分段锁机制提高并发)

time

Period.between获取的是区分年月日内容,并非实际间隔

  1. LocalDate from = LocalDate.of(2000,1,1);
  2. Period period = Period.between(from,LocalDate.now());
  3. System.out.println("2020-01-01到当前日期" + LocalDate.now());
  4. System.out.println("距离当前多少年:" + period.getYears());
  5. System.out.println("距离当前多少月:" + period.getMonths());
  6. System.out.println("距离当前多少日:" + period.getDays());
  7. //如果需要计算实际天数间隔,可使用以下方法
  8. LocalDate to = LocalDate.of(2000, 1, 1);
  9. long day = LocalDate.now().toEpochDay() - to.toEpochDay();
  10. OR
  11. long day = ChronoUnit.DAYS.between(LocalDate.now(), to);//from 到to的间隔,小于0表示from>to
  12. System.out.println("距离当前多少日:" + day);

function

方法
Supplier 无参数,只有返回值
- get
Consumer 无返回值
- accept:该函数式接口的唯一的抽象方法,接收一个参数,没有返回值.
- andThen:在执行完调用者方法后再执行传入参数的方法
Predicate 输出boolean
- test:函数式接口断言,给一个参数T,返回boolean类型的结果。
- and:接收一个Predicate类型,装传入的条件和当前条件以并且的关系过滤数据。
- or:or方法接收一个Predicate类型,将传入的条件和当前的条件以或者的关系过滤数据。
- negate:将当前条件取反。
- isEquals:通过传入对象的equals方法进行判断。
- not:将传入条件取反。
UnaryOperator 输入T,输出T
Function 输入T,输出R
- apply:函数式接口方法,输入T,输出R。
- compose:compose接收一个Function参数,先执行传入的逻辑,再执行当前的逻辑。
- andThen:andThen接收一个Function参数,先执行当前的逻辑,再执行传入的逻辑。
- identity:方便方法的连缀,返回当前对象。

Supplier:T get()

Consumer:void do()

Predicate: boolean test(T)

Function:R apply(T)

自定义:在interface上增加注解@FunctionalInterface


  1. Function<T, R> => R apply(T t); 接受一个输入参数,返回一个结果
  2. BiFunction<T, U, R> => R apply(T t, U u); 接受两个输入参数,返回一个结果
  3. Predicate<T> => boolean test(T t); 接受一个输入参数,返回布尔值
  4. BiPredicate<T, U> => boolean test(T t, U u); 接受两个输入参数,返回布尔值
  5. Supplier<T> => T get(); 无输入参数,返回一个结果
  6. BooleanSupplier => boolean getAsBoolean();
  7. Consumer<T> => void accept(T t); 接受一个输入参数,无返回值
  8. BiConsumer<T, U> => void accept(T t, U u); 接受两个输入参数,无返回值
  9. BinaryOperator
  10. static <T> T operatorBy(T num1, T num2, BinaryOperator<T> result) {
  11. // 返回两个参数的计算结果
  12. return result.apply(num1, num2);
  13. }
  14. static <T> T minBy(T str1, T str2, Comparator<T> comparator) {
  15. // 返回两者里面较小的一个
  16. return BinaryOperator.minBy(comparator).apply(str1, str2);
  17. }
  18. static <T> T maxBy(T str1, T str2, Comparator<T> comparator) {
  19. // 返回两者里面较大的一个
  20. return BinaryOperator.maxBy(comparator).apply(str1, str2);
  21. }
  22. operatorBy(4,2,(num1,num2)->num1 - num2)
  23. minBy("hello","wonders", Comparator.comparingInt(String::length))
  24. //-- Predicate
  25. Predicate<String> predicate = (s) -> s.length() > 0;
  26. predicate.test("foo"); // true
  27. predicate.negate().test("foo"); // false
  28. Predicate<Boolean> nonNull = Objects::nonNull;
  29. Predicate<Boolean> isNull = Objects::isNull;
  30. Predicate<String> isEmpty = String::isEmpty;
  31. Predicate<String> isNotEmpty = isEmpty.negate();
  32. // --Functions
  33. Function<String, Integer> toInteger = Integer::valueOf;
  34. Function<String, String> backToString = toInteger.andThen(String::valueOf);
  35. backToString.apply("123"); // "123"
  36. //-- Suppliers
  37. Supplier<Person> personSupplier = Person::new;
  38. personSupplier.get(); // new Person
  39. //-- Consumers
  40. Consumer<Person> greeter = (p) -> System.out.println("Hello, " + p.firstName);
  41. greeter.accept(new Person("Luke", "Skywalker"));
  42. //-- Comparators
  43. Comparator<Person> comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName);
  44. Person p1 = new Person("John", "Doe");
  45. Person p2 = new Person("Alice", "Wonderland");
  46. comparator.compare(p1, p2); // > 0
  47. comparator.reversed().compare(p1, p2); // < 0

stream

  1. # 以集合对象中某个字段构造Map集合
  2. .collect(Collectors.toMap(ClassName::getId, Function.identity())) # Map<String,Class>
  3. .collect(Collectors.groupingBy(ClassName::getParent)) # Map<String,List<Class>>
  4. # 获取集合对象中某个字段的集合
  5. .stream().map(ClassName::properties).collect(Collectors.toList())
  6. # 累加
  7. Stream::mapToInt
  8. Stream::mapToDouble
  9. Stream::mapToLong
  10. int sum = list.stream().mapToInt(p -> p.getNum()).sum();
  11. BigDecimal sum = list.stream().map(Person::getAmount).reduce(BigDecimal::add).get();
  12. BigDecimal sum = list.stream().map(item -> item.getAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);