当前位置: 首页 > news >正文

Java函数式编程

目录

1、函数式编程核心概念

1.1、什么是函数式编程

 1.2、Java8的函数式支持

2、Lambda表达式

2.1、基本语法

2.2、使用示例

3、函数式接口

3.1、核心函数式接口

4、方法引用

4.1、示例代码

 5、Stream API

5.1、流操作三个步骤

5.2、常用操作

6、Optional类

6.1、主要方法

6.2、使用示例

7、函数式编程实践


 

1、函数式编程核心概念

1.1、什么是函数式编程

  • 函数可以像变量一样传递和使用
  • 更加关注“做什么”而非“如何做”
  • 函数不修改外部状态
  • 避免可变状态

 1.2、Java8的函数式支持

  • Lambda表达式
  • 方法引用
  • Stream API
  • Optional类
  • 默认方法
  • 函数式接口

2、Lambda表达式

2.1、基本语法

(parameters)-> expression 或者 (parameters) -> {statements;}

2.2、使用示例

// 传统匿名类
Runnable r1 = new Runnable() {
    public void run() {
        System.out.println("Hello");
    }
};

// Lambda表达式,无参数,单号代码,省去{}和return
Runnable r2 = () -> System.out.println("Hello");

// 带参数的Lambda,多个参数
Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2);

// 多行代码,单个参数可以省去()
Function<String, Integer> f = s -> {
    System.out.println("Processing: " + s);
    return s.length();
};

3、函数式接口

3.1、核心函数式接口

接口方法用途
Function<T,R>R apply(T t)传入T返回R
Consumer<T>void accept(T t)消费T无返回
Supplier<T>T get()提供T型对象
Predicate<T>Boolean test(T t)断言判断
UnaryOperator<T>T apply(T t)一元运算
BinaryOperator<T>T apply(T t1, T t2)二元运算

3.2、自定义函数式接口

@FunctionalInterface
interface StringProcessor {
    String process(String input);
    
    // 只能有一个抽象方法
    default void info() {
        System.out.println("Functional interface");
    }
}

4、方法引用

  • 静态方法引用:ClassName::staticMethod
  • 实例方法引用:instance::method
  • 任意对象方法引用:ClassName::method
  • 构造方法引用:ClassName::new

4.1、示例代码

// 静态方法
Function<String, Integer> p = Integer::parseInt;

// 实例方法
Consumer<String> printer = System.out::println;

// 任意对象方法
Function<String, String> upper = String::toUpperCase;

// 构造方法
Supplier<List<String>> listSupplier = ArrayList::new;

 5、Stream API

5.1、流操作三个步骤

1、创建流:集合、数组、I、O等

2、中间操作:过滤、映射、排序等

3、终端操作:收集、计算、遍历

5.2、常用操作

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 过滤和映射
List<String> result = names.stream()
    .filter(s -> s.length() > 3)
    .map(String::toUpperCase)
    .collect(Collectors.toList());

// 分组
Map<Integer, List<String>> groupByLength = names.stream()
    .collect(Collectors.groupingBy(String::length));

// 并行处理
long count = names.parallelStream()
    .filter(s -> s.startsWith("A"))
    .count();

6、Optional类

6.1、主要方法

  • of()/ofNullable()

  • isPresent()/ifPresent()

  • orElse()/orElseGet()/orElseThrow()

  • map()/flatMap()

  • filter()

6.2、使用示例

Optional<String> opt = Optional.ofNullable(getName());

// 传统null检查
if (opt.isPresent()) {
    System.out.println(opt.get());
}

// 函数式风格
opt.ifPresent(System.out::println);

// 链式操作
String result = opt.map(String::toUpperCase)
                 .orElse("DEFAULT");

7、函数式编程实践

// 传统方式
List<String> filtered = new ArrayList<>();
for (String name : names) {
    if (name.length() > 3) {
        filtered.add(name.toUpperCase());
    }
}

// 函数式方式
List<String> filtered = names.stream()
    .filter(n -> n.length() > 3)
    .map(String::toUpperCase)
    .collect(Collectors.toList());

相关文章:

  • Java基础——面向对象
  • 如何在Vue项目中封装axios
  • 人工智能生成的图片,受著作权法保护吗?
  • Apache SeaTunnel 用户征稿计划启动!分享数据集成实践经验,赢社区荣誉!
  • verilog/systemverilog中的位序问题
  • 【3天!!!从0-1完成自动化集成平台开发--Cursor AI赋能0代码基础测试工程师开发平台-亲测有效-保姆级】
  • Python 装饰模式
  • springboot 实现base64格式wav转码并保存
  • DeepSeek 给 API 网关上了一波热度
  • 0.雷达信号
  • 常用设计模式
  • 宝塔SSL申请Let‘s Encrypt提示“验证信息构造失败!{}“
  • 网损仪详解
  • 深度学习笔记19-YOLOv5-C3模块实现(Pytorch)
  • win10下python脚本运行缺失ccache的问题处理
  • 性能测试~
  • 线程同步——读写锁
  • MYTOOL-记事本
  • C#基础学习(八)终章 C#中的结构体
  • Mockito 全面指南:从单元测试基础到高级模拟技术
  • 女网友叫我一起做优惠券网站/郑州网站推广效果
  • 珠海网站建设及优化/百度网页排名怎么提升
  • 学校网站怎么做的好处/怎么学seo基础
  • 查企业信息的国家网站/上海网站建设咨询
  • 手机适配网站/企业seo优化服务
  • 嘉兴网站建设推广/如何提升百度关键词排名