非常简单且实用的函数式编程(国庆day1)

    科技2022-07-11  85

    函数式:用Lambda表达式实现函数的方式

    1 什么时候使用函数式编程?

    1.1 集合的操作

    1.1.1 转换

    list set map之间转换

    1.1.2 聚合操作

    count:获取数据数量 max:获取按照规则约定的最大值 min:获取按照规则约定的最小值 avg:获取平均值

    1.1.3 循环处理

    foreach:对数据进行循环处理

    1.1.4 转换为String

    joining:字符串数据指定分隔符

    1.1.5 分组

    groupingBy:按照特定功能处理分组

    1.1.6 获取数组

    toArray:数据转换为Object数组

    1.2 Stream的操作

    1.2.1 过滤

    filter:按照规则筛选数据 distinct:过滤掉相同的数据

    1.2.2 转换

    map:接收一个T,返回一个R flatMap:处理Stream嵌套问题

    1.2.3 其他操作

    skip:忽略前n条数据 limit:限制只需要前n条数据 sorted:将数据排序

    1.3 Optional的操作

    1.3.1 检测是否为空

    isPresent:存在返回true isEmpty:为空返回true

    1.3.2 条件运算

    ifPresent:存在则执行

    1.3.3 默认值

    orElse:当Optional为空时的的默认值

    1.3.4 获取值

    get:不为空时,获取数据

    1.3.5 过滤

    filter:对数据进行过滤

    1.4 函数接口

    1.4.1 Predicate

    有输入且输出为布尔值

    1.4.2 Function

    有输入且有输出

    1.4.3 Supplier

    有输出没有输入

    1.4.4 Consumer

    有输入且没有输出

    1.4.5 Operator

    输入和输出同一类型

    1.4.6 Comparator

    输入两个值且输出为布尔值

    1.5 方法引用

    1.5.1 构造函数引用

    ::new

    1.5.2 静态方法的引用

    Integer:: toString

    1.5.3 实例方法引用

    person:: getName

    1.5.4 引用任意对象的方法

    forEach(person:: getName)

    1.6 lambda表达式使用

    ()输入参数->()返回值

    2 集合操作示例

    public class _03finalStream { public static void main(String[] args) { List<Person> people = Arrays.asList(new Person("zhangsan", "男"), new Person("lisi", "男"), new Person("xiaohong", "女")); /** * 聚合操作 */ //数量 people.stream().count(); //最大值 people.stream().max(Comparator.comparing(Person::getWeight)); /** * 循环 */ people.stream().forEach(System.out::println); /** * 匹配 */ //全匹配 people.stream().allMatch(Person::isMale); //任意匹配 people.stream().anyMatch(Person::isMale); //不匹配 people.stream().noneMatch(Person::isMale); /** * 查找 */ //获取任意数据 Person person = people.stream().findAny().get(); //获取第一条数据 Person person1 = people.stream().findFirst().get(); /** * 获取数组 */ Object[] peopleArray = people.stream().toArray(); /** * 累计聚合操作 */ Integer r1 = Stream.of(1, 2, 3).reduce((a, b) -> a + b).get(); /** * collect */ Stream<String> nameStream = Stream.of("zhangsan", "lisi"); //转为集合 List<String> nameList = nameStream.collect(Collectors.toList()); // Set<String> nameSet = nameStream.collect(Collectors.toSet()); //转为String // String nameString = nameStream.collect(Collectors.joining(",")); //聚合操作 //数量 // Long nameCount = nameStream.collect(Collectors.counting()); //最大值 /// nameStream.collect(Collectors.maxBy(Comparator.comparing(String::length))).get(); //平均值 // Double nameLength = nameStream.collect(Collectors.averagingLong(String::length)); //排序,最大值,最小值,平均值,数量,分组 List<Integer> numList = Arrays.asList(3, 2, 1, 4, 8, 6, 7); Stream<Integer> numStream = numList.stream(); numStream.sorted(Comparator.comparing(Integer::intValue)).forEach(System.out::println); IntSummaryStatistics numSummary = numStream.collect(Collectors.summarizingInt(Integer::intValue)); System.out.println(numSummary.getMax() + " " + numSummary.getMin() + " " + numSummary.getAverage() + " " + numSummary.getCount()); Map<Integer, List<Integer>> map = numStream.collect(Collectors.groupingBy(Integer::intValue)); /** * 生成map */ Map<Integer, Integer> map1 = numStream.collect(Collectors.toMap(Function.identity(), Integer::intValue)); } }

    3 Stream操作示例

    public class _02IntermediateStream { public static void main(String[] args) { /** * filter */ List<Person> people = Arrays.asList(new Person("zhangsan", "男"), new Person("lisi", "男"), new Person("xiaohong", "女")); //1 函数接口 people.stream().filter(person -> person.getGender().equals("男")) .forEach(person -> System.out.println(person)); //2 方法引用 people.stream().filter(Person::isMale).forEach(System.out::println); /** * distinct */ people.stream().distinct() .forEach(System.out::println); people.stream().distinct() .filter(person -> person.getGender().equals("男")) .forEach(System.out::println); /** * map */ Stream<Integer> nameLength = people.stream() .map(Person::getName) .map(String::length); /** * flatMap:解决stream嵌套问题 */ List<Person> people1 = Arrays.asList(new Person("zhangsan", "man", 100)); List<Person> people2 = Arrays.asList(new Person("lisi", "woman", 200)); List<List<Person>> peopleList = Arrays.asList(people1, people2); /** * 使用map需要处理嵌套的Stream */ peopleList.stream() .map(Collection::stream) .forEach(personStream -> personStream.forEach(System.out::println)); /** * 将一个流转为两个流,然后再合成为一个流 */ peopleList.stream() .flatMap(Collection::stream) .forEach(System.out::println); /** * 其他操作 */ /** * 忽略前N条 */ people1.stream().skip(1).forEach(System.out::println); /** * 只取前N条 */ people1.stream().limit(1).forEach(System.out::println); /** * 将数据排序 */ people1.stream().sorted(Comparator.comparing(Person::getWeight)).forEach(System.out::println); } }

    4 Optioanl操作示例

    public class _01getOptional { public static void main(String[] args) { Optional<Object> emptyOptional = Optional.empty(); Optional<String> stringOptional = Optional.of("zhangsan"); String str1 = "zhangsan"; String str2 = null; Optional<String> stringOptional1 = Optional.ofNullable(str1); Optional<String> nullOptional2 = Optional.ofNullable(str2); //检查是否存在 System.out.println(stringOptional.isPresent()); System.out.println(nullOptional2.isPresent()); System.out.println(nullOptional2.isEmpty()); //条件运算 stringOptional1.ifPresent(System.out::println); //默认值 nullOptional2.orElse("lisi"); //获得值 if (nullOptional2.isPresent()) { nullOptional2.get(); } //数据过滤 nullOptional2.filter(s -> s.equals("zhangsan")).isPresent(); //转换处理 String str2 = nullOptional2.map(s -> "map" + s).get(); } }

    5 函数式接口

    5.1 Predicate

    public class _01Predicate { public static void main(String[] args) { /** * i>0 */ IntPredicate greaterThan0 = i -> i > 0; System.out.println(greaterThan0.test(10)); /** * negate: i<=0 */ IntPredicate negate = greaterThan0.negate(); System.out.println(negate.test(10)); /** * and: i>0 and i<100 */ IntPredicate lessThan100 = i -> i <= 100; IntPredicate and = greaterThan0.and(lessThan100); System.out.println(and.test(10)); /** * or: i>0 or i>0 or i<100 */ IntPredicate or = greaterThan0.or(lessThan100); System.out.println(or.test(-100)); /** * BiPredicate:两个参数 */ BiPredicate<String,Integer> isLenThanGivenLen = (str, len) -> str.length() > len; System.out.println(isLenThanGivenLen.test("123",3)); } }

    5.2 Function

    public class _02Function { public static void main(String[] args) { /** * apply */ Function<String, Integer> lengthFunction = str -> str.length(); System.out.println(lengthFunction.apply("123")); Function<Integer, Integer> plusFunction = x -> x + x; Function<Integer,Integer> multiFunction = x -> x * x; /** * andThen */ Function<Integer, Integer> andThen = plusFunction.andThen(multiFunction); System.out.println(andThen.apply(2)); /** * compose */ Function<Integer, Integer> compose = plusFunction.compose(multiFunction); System.out.println(compose.apply(2)); /** * 参数固化 */ IntFunction<Integer> intPlusFunction = x -> x + x; System.out.println(intPlusFunction.apply(2)); /** * 返回值固化 */ ToIntFunction<Integer> toIntPlusFunction = x -> x + x; System.out.println(toIntPlusFunction.applyAsInt(2)); /** * 参数和返回值都固化 */ IntToLongFunction intToLongPlusFunction = x -> x + x; System.out.println(intToLongPlusFunction.applyAsLong(2)); /** * 两个参数 */ BiFunction<String,String,Integer> biFunction = (str1, str2) -> str1.length() + str2.length(); System.out.println(biFunction.apply("123","456")); } }

    5.3 Consumer

    public class _03Consumer { public static void main(String[] args) { Consumer<String> lengthConsumer = str -> System.out.println(str.length()); lengthConsumer.accept("123"); } }

    5.4 Supplier

    public class _04Supplier { public static void main(String[] args) { Supplier<Long> supplier = () -> System.currentTimeMillis(); System.out.println(supplier.get()); } }

    5.5 Operator

    public class _05Operator { public static void main(String[] args) { IntUnaryOperator operatorFunction = x -> x + x; System.out.println(operatorFunction.applyAsInt(2)); } }

    5.6 Comparator

    public class _06Comparator { public static void main(String[] args) { Comparator<Integer> compareFunction = (num1, num2) -> num1.compareTo(num2); System.out.println(compareFunction.compare(1,2)); } }

    6 方法引用

    6.1 Constructor

    public class _01Constructor { public static void main(String[] args) { //1 无参数构造,只生产不消费 Supplier<Person> emptyConstructor = Person::new; Person person = emptyConstructor.get(); person.setName("zhangsan"); System.out.println(person); //2 一个参数构造,既生产又消费 Function<String, Person> nameConstructor = Person::new; Person person1 = nameConstructor.apply("zhangsan"); System.out.println(person1); //3 两个参数构造,既生产又消费 BiFunction<String, String, Person> nameAndGenderConstructor = Person::new; Person person2 = nameAndGenderConstructor.apply("zhangsan", "man"); System.out.println(person2); } }

    6.2 Static

    public class _02Static { public static void main(String[] args) { /** * toString方法是Integer类的静态方法 */ IntFunction<String> intToStringFunction = Integer::toString; System.out.println(intToStringFunction.apply(123)); } }

    6.3 Instance

    public class _03Instance { public static void main(String[] args) { Person person = new Person("zhangsan", "man", 100); Consumer<String> walkConsumer = person::walk; walkConsumer.accept("上海路"); } }

    6.4 AnyInstance

    public class _04AnyInstance { public static void main(String[] args) { List<Person> people = Arrays.asList(new Person("zhagnsan", "man", 123) , new Person("lisi", "man", 456)); people.forEach(Person::sayName); } }
    Processed: 0.022, SQL: 8