Java函数式编程

一、什么是函数是编程

相信大家都使用过面向对象的编程语言,面向对象编程是对数据进

行抽象,而函数式编程是对行为进行抽象。函数式编程让程序员能够写出更加容易阅读的代码。那什么时候函数式编程呢?

函数式编程是一种编程的方法论,主要是将行为编写成一个个的函数。

什么是函数?函数就是对输入的值进行处理,返回另外的值。

二、lambda表达式

1. 将list转为map

public Map<String, AClass> getLarkMap(List<AClass> aList) {
   return aList.stream().collect(Collectors.toMap(AClass::getUrl, a -> a, (k1, k2) -> k2));
}

  

2. 将list中感兴趣的内容过滤出来

public List<AClass> getLarkList(String url, List<AClass> aList) {
   return aList.stream().filter(AClass -> AClass.getUrl().equals(url)).collect(Collectors.toList());
}

 

3. Predicate & Consumer & Function

public class FunctionProgramming {
    private Logger logger = LoggerFactory.getLogger(FunctionProgramming.class);

//    Predicate函数式接口的主要作用就是提供一个test方法,接受一个参数返回一个布尔类型。
//    Predicate在stream api中进行一些判断的时候非常常用。
    @Test
    public void testPredicate() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        List<Integer> res = filter(list, num -> num > 5);
        res.stream().forEach(System.out::print);
        System.out.println();

        res = filterAnd(list, num -> num > 3, num -> num < 7);
        res.stream().forEach(System.out::print);
    }

//    描述:Consumer<T>接口接受一个T类型参数,没有返回值。
    @Test
    public void testConsumer() {
        Student student = Student.builder().build();
        Consumer<Student> consumer = stu -> stu.setName("stu");
        consumer.accept(student);
        consumer = stu -> stu.setAge(18);
        consumer.accept(student);
        logger.info(student.toString());
    }

    @Test
    public void testConsumer2() {
        Student student = Student.builder().name("stu").age(18).build();
        String stuStr = JSON.toJSONString(student);

        Student newStudent = changeInfo(stuStr, Student.class, stu -> {
            stu.setAge(19);
        });
        logger.info(newStudent.introduce());
    }

    @Test
    public void testPredicateConsumer() {
        Student student = Student.builder().build();
        Predicate<Student> predicate = stu -> stu.getName() == null;
        Consumer<Student> consumer = stu -> stu.setName("stu");
        predicateConsumer(student, predicate, consumer);
        logger.info(student.toString());
    }

//    Function<T,R>  接收一个参数并返回结果的函数
//    接口方法 R apply(T t) 将此参数应用到函数中
    @Test
    public void testFunction() {
        Function<String, String> function = str -> str += "!";
        logger.info(function.apply("Hello world"));

        String name = "jack";
        Student jack = Student.builder().name(name).age(18).build();
        Map<String, Student> map = new HashMap<>();
        map.put(name, jack);

//        举个简单的例子用来说明function的使用方法
        logger.info("{} age: {}", name, getAge(name, map, student -> student.getAge()));
    }
private List<Integer> filter(List<Integer> list, Predicate<Integer> predicate) {
        return list.stream().filter(predicate).collect(Collectors.toList());
    }

    private List<Integer> filterAnd(List<Integer> list, Predicate<Integer> pre1, Predicate<Integer> pre2) {
        return list.stream().filter(pre1.and(pre2)).collect(Collectors.toList());
    }

    private void predicateConsumer(Student student, Predicate<Student> predicate, Consumer<Student> consumer) {
        if (predicate.test(student)) {
            consumer.accept(student);
        }
    }

    private <T extends Person> T changeInfo(String msg, Class<T> tClass, Consumer<T> consumer) {
        T t = JSONObject.parseObject(msg, tClass);
        Assert.assertNotNull(t);
        consumer.accept(t);
        return t;
    }

    private int getAge(String name, Map<String, Student> map, Function<Student, Integer> function) {
        Student student = map.get(name);
        return function.apply(student);
    }
}

Student.java

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Student implements Person {
    private String name;
    private int age;

    @Override
    public String introduce() {
        return this.toString();
    }
}

 

posted @ 2021-06-04 19:04  myLittleGarden  阅读(520)  评论(0)    收藏  举报