函数式编程 lambda表达式 Java8 学习笔记(1)

本文介绍Java函数式编程风格,其本质仍是面向对象,执行机制将集合当流处理。还提及常用方法如Stream()、Collet()、Filter(),Optional可解决空指针,介绍类库使用及继承三规则,给出参考代码和资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面 我理解的函数式编程风格

1.是一种编程风格,java依然是面向对象的思想其本质并为改变。
2.执行机制的改变,把集合当作流进行处理,最后转回集合,官方说提升效率,民间说较低效率。我的理解是正确的使用会提示效率,反之则得不偿失。
3.对于老的java程序员来说,这种风格会造成代码可读性下降(没错,是下降而不是提高),因为不太适应,另外还有个严重问题是目前的主流idea并不能良好debug,我的建议是先拆开写,调试好再利用IDEA的智能提示转换。

常用的方法 第一行代码

List<Artist> bands = musicians.stream()
.filter(artist ->artist.getName().startsWith("The"))
.collect(toList());
  • 功能:将音乐对象中的曲目是The开头的歌曲筛选出来,并返回成List
  • 用到了三个非常常用的方法
  1. Stream()

将你的集合转换为流,这一般是函数式编程的开始,我称之为启式,直到收式以前,java8将使用流对你的数据业务进行处理。

  1. Collet() { Count() FindFirst() FindAny() }

这就是收式,一般来说处理完的流对象,需要用收式来结尾。

  1. Filter()

添加条件,需要传入一个new Predicate匿名内部类(对应的拉姆达表达式)

Optional

用来解决空指针的包装类
get() 获取容器里面的值
isPresent() 容器内是否有值
orElse(T t) 无值是返回T
orElseGet(Supplier s) 无值时执行function

类库

public static void printTrackLengthStatistics(Album album) {
        IntSummaryStatistics trackLengthStats
                = album.getTracks()
                .mapToInt(track -> track.getLength())
                .summaryStatistics();

        System.out.printf("Max: %d, Min: %d, Ave: %f, Sum: %d",
                trackLengthStats.getMax(),
                trackLengthStats.getMin(),
                trackLengthStats.getAverage(),
                trackLengthStats.getSum());
    }

算出一张专辑曲目的最长时间 、 最短时间等等。。
mapToInt 转成一个 IntStream对象
IntSummaryStatistics这个类很强大

继承的三规则

1.类胜于方法。 如果在继承链中有方法体或抽象的方法声明,那么就可以忽略接口中定义的方法。

2.子类胜于父类。 如果一个接口继承另一个接口,且两个接口都定义了一个默认方法,那么子接口中定义的方法胜出。

3.没有规则三。 如果上面两条规则不适用,子类要么实现该方法,要么将该方法声明为抽象方法。

内置函数

1. Predicate<T> | 传参返回布尔
参数类型:T
返回值:boolean
示例:Predicate<String> isAdmin = name -> "admin".equals(name);

2. Consumer<T> | 传参无返回
参数:T
返回值:void
示例:Consumer<String> print = msg -> System.out.println(msg);

3. Function<T,R> | 传参有返回
参数:T
返回值:R
示例:Function<Long, String> toStr = value -> String.valueOf(value);

4. Supplier<T> | 无参有返回
参数:none
返回值:T
示例:Supplier<Date> now = () -> new Date();

5. UnaryOperator<T> | 
参数:T
返回值:T
示例:UnaryOperator<Boolean> negation = value -> !value.booleanValue();

6. BinaryOperator<T> | 
参数:(T, T)
返回值:T
示例:BinaryOperator<Integer> intDouble = (i, j) -> i + j;

7. Runnable | 无参无返回
参数:none
返回值:void
示例:Runnable helloWord = () -> System.out.println("Hello World");

8. Callable<T> | 无参有返回
参数:none
返回值:T
示例:Callable<LocalDate> now1 = ()->LocalDate.now();

参考代码

https://github.com/AntonyZhouPlus/Functional_java_code_examples

参考资料

《JAVA8 函数式编程》 Richard Warburton

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值