Java流式编程入门学习

一、简介

Lambda表达式作为Java8的新特性,目的是为了让方法变得更加简洁,不再需要实现接口就可以执行方法。

实例代码

 public static void main(String[] args) {
        //第一种方式
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("创建一个新的线程");
            }
        }).start();

        //第二种方式
        new Thread(() -> {
            System.out.println("创建一个新的线程");
        }).start();
    }

二、函数式接口的学习

通过上面的代码我们发现Runable是一个函数式接口

函数式接口的必要条件

1.式interface接口

2.有且只有一个抽象方法。

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

 例子

  当有两个类型 的函数接口无法区分的时候,需要类型转换。

package com.nw.interfacedemo;


/**
 * 1.类型是接口
 * 2.有且只有一个抽象方法。
 */
@FunctionalInterface
interface InterfaceDemoA {
    void doSth();
}

@FunctionalInterface
interface InterfaceDemoB {
    void doSth();
}

public class FunctionDemo {
    void doSth(InterfaceDemoA interfaceDemo) {
        System.out.println("function A");
        interfaceDemo.doSth();
    }

    void doSth(InterfaceDemoB interfaceDemo) {
        System.out.println("function B");
        interfaceDemo.doSth();
    }

    public static void main(String[] args) {
        FunctionDemo functionDemo = new FunctionDemo();
        functionDemo.doSth((InterfaceDemoA) ()->{
            System.out.println("输出一个新东西");
        });
        //当不知道类型的时候,需要自己确定类型
        functionDemo.doSth((InterfaceDemoB)()->{
            System.out.println("输出一个新东西");
        });

    }
}

三、jdk常用的函数接口用法

jdk一般的函数接口都位于java.util.function包下面,大家可以都学习一下,常用的要记住相关用法。

package com.nw.commonfundemo;

import java.util.function.*;

/**
 * jdk常用的函数接口
 */
public class JdkFunctionDemo {
    public static void main(String[] args) {
        //Supplier 没有出入,只有一个输出
        Supplier<String> supplier = () -> "this is supplier";
        System.out.println(supplier.get());

        //Consumer 只有一个输入,没有输出
        Consumer<String> consumer = i -> System.out.println("this is demo for" + i);
        consumer.accept("consumer");

        //Function 输入T 输出R
        Function<Integer, Integer> function = i -> i * i;
        System.out.println("Funtion demo " + function.apply(12));

        //输入输出都是T
        UnaryOperator<Integer> unaryOperator = i -> i * i;
        System.out.println("unaryOperator demo " + unaryOperator.apply(12));

        //输入T,U,输出R
        BiFunction<Integer, Integer, String> biFunction = (i, j) -> "this result =" + (i * j);
        System.out.println("biFunction demo " + biFunction.apply(10, 5));
    }
}
### Java 流式编程简介 Java 流式编程是一种强大的工具,用于处理集合数据。它提供了一种声明式的编程风格,使开发者能够专注于“做什么”,而不是“怎么做”。流式编程的核心在于 `Stream` 接口及其丰富的操作方法。 以下是关于 Java 流式编程的一些核心概念和示例代码: --- #### 1. **创建 Stream 的几种方式** 可以通过多种方式创建 `Stream` 对象,具体如下所示: - **通过集合创建** ```java import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class CreateStreamFromCollection { public static void main(String[] args) { List<String> list = Arrays.asList("a", "b", "c"); Stream<String> stream = list.stream(); stream.forEach(System.out::println); } } ``` - **通过数组创建** ```java import java.util.Arrays; import java.util.stream.Stream; public class CreateStreamFromArray { public static void main(String[] args) { String[] array = {"a", "b", "c"}; Stream<String> stream = Arrays.stream(array); stream.forEach(System.out::println); } } ``` - **直接创建** ```java import java.util.stream.Stream; public class DirectCreateStream { public static void main(String[] args) { Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5); stream.forEach(s -> System.out.print(s + "\t")); } } ``` - **创建数字范围流** ```java import java.util.stream.IntStream; public class RangeStreamExample { public static void main(String[] args) { IntStream intStream = IntStream.range(1, 5); // 不包含结束值 intStream.forEach(i -> System.out.print(i + "\t")); } } ``` - **生成无限流** ```java import java.util.Random; import java.util.stream.Stream; public class InfiniteStreamExample { public static void main(String[] args) { Random random = new Random(); Stream<Double> infiniteStream = Stream.generate(random::nextDouble).limit(5); infiniteStream.forEach(d -> System.out.printf("%.2f\t", d)); } } ``` --- #### 2. **中间操作 (Intermediate Operations)** 中间操作不会立即执行,而是返回一个新的流对象,等待终端操作触发实际计算。 常见中间操作包括: - `filter`: 过滤满足条件的元素。 - `map`: 将每个元素映射为新的形式。 - `sorted`: 对流中的元素进行排序。 - `distinct`: 去重。 **示例代码:过滤、映射和去重** ```java import java.util.Arrays; import java.util.stream.Collectors; import java.util.stream.Stream; public class IntermediateOperationsExample { public static void main(String[] args) { Stream<String> stream = Stream.of("apple", "banana", "orange", "Apple"); List<String> result = stream .filter(s -> s.startsWith("a") || s.startsWith("A")) // 条件过滤 .map(String::toLowerCase) // 转小写 .distinct() // 去重 .sorted() // 排序 .collect(Collectors.toList()); System.out.println(result); // 输出: [apple, apricot] } } ``` --- #### 3. **终端操作 (Terminal Operations)** 终端操作会触发整个流水线的实际执行,并通常会产生最终的结果或副作用。 常见的终端操作有: - `forEach`: 遍历流中的每一个元素。 - `collect`: 收集结果到集合或其他容器。 - `reduce`: 执行规约运算。 - `count`: 统计流中元素的数量。 **示例代码:使用 reduce 计算总和** ```java import java.util.Arrays; import java.util.List; public class TerminalReduceExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(4, 5, 3, 9); int sum = numbers.stream() .reduce(0, Integer::sum); // 初始值为0,累加求和 System.out.println(sum); // 输出: 21 } } ``` --- #### 4. **flatMap 示例** 当需要将嵌套结构展平为单层结构时,可以使用 `flatMap` 操作。 **示例代码:展开二维列表** ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class FlatMapExample { public static void main(String[] args) { List<List<String>> nestedList = Arrays.asList( Arrays.asList("a", "b"), Arrays.asList("c", "d") ); List<String> flatList = nestedList.stream() .flatMap(List::stream) .collect(Collectors.toList()); System.out.println(flatList); // 输出: [a, b, c, d] } } ``` --- #### 5. **并行流 Parallel Streams** 为了提高性能,可以在多核处理器上启用并行流来加速大规模数据的操作。 **示例代码:并行流遍历** ```java import java.util.stream.IntStream; public class ParallelStreamsExample { public static void main(String[] args) { long count = IntStream.rangeClosed(1, 1_000_000) .parallel() // 启用并行模式 .filter(n -> n % 2 == 0) // 筛选偶数 .count(); System.out.println(count); // 输出: 500000 } } ``` --- ### 总结 以上介绍了 Java 流式编程的基础知识和常用操作,包括如何创建流、中间操作、终端操作以及高级特性如 `flatMap` 和并行流。这些功能使得复杂的数据处理逻辑更加简洁高效[^1][^2][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BingShuBlog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值