使用Java函数式编程来生成基础数据(数组)

16 篇文章 0 订阅
16 篇文章 0 订阅
本文探讨如何利用Java函数式编程风格,通过BiFunction接口实现生成不同类型的整型数组,包括有序、降序和乱序数组,提升代码复用性和通用性。通过实例展示了如何使用Lombok的getter方法调用这些生成器函数。
摘要由CSDN通过智能技术生成

Java函数式编程来生成基础数组

源代码头部

import lombok.Getter;

import java.util.Arrays;
import java.util.Collections;
import java.util.Random;
import java.util.function.BiFunction;
import java.util.stream.IntStream;
@Getter
public class ArrayGenerate {

第一个属性,使用经典方法来逐个生成有序Integer数组

    private BiFunction<Integer, Integer, Integer[]> classic_array_generate =
            (Integer start, Integer end) -> {
                int len = end - start + 1;
                Integer[] arr = new Integer[len];
                for (int i = 0; i < len; i++) {
                    arr[i] = start + i;
                }
                return arr;
            };

第二个属性,使用Stream来生成有序的Integer数组

    private BiFunction<Integer, Integer, Integer[]> stream_array_generate =
            (Integer start, Integer end) -> IntStream.rangeClosed(start, end).boxed().toArray(Integer[]::new);

第三个属性,使用Stream生成一个降序的Integer数组

把降序的排序成升序的最考验时长

    private final BiFunction<Integer, Integer, Integer[]> stream_array_desc_generate =
            (Integer start, Integer end) -> {
                Integer[] integers = IntStream.rangeClosed(start, end).boxed().toArray(Integer[]::new);
                Arrays.sort(integers, Collections.reverseOrder());
                return integers;
            };

第四属性,使用Stream生成一个乱序的Integer数组

    private final BiFunction<Integer, Integer, Integer[]> stream_array_unordered_generate =
            (Integer start, Integer end) -> {
                Integer[] integers = IntStream.rangeClosed(start, end).boxed().toArray(Integer[]::new);
                Random random = new Random();
                for (int i = integers.length - 1; i > 0; i--) {
                    int position = random.nextInt(i + 1);
                    int temp = integers[position];
                    integers[position] = integers[i];
                    integers[i] = temp;
                }
                return integers;
            };

以下与上面内容对应,只不过是生成int数组

    private BiFunction<Integer, Integer, int[]> stream_array_int_generate =
            (Integer start, Integer end) -> IntStream.rangeClosed(start, end).toArray();
    private BiFunction<Integer, Integer, int[]> stream_array_int_unordered_generate1 =
            (Integer start, Integer end) -> {
                int[] arr_temp = IntStream.rangeClosed(start, end).toArray();
                int len = arr_temp.length;
                int[] arr = new int[len];
                Random random = new Random();
                for(int i = end - start; i >= 0; i--) {
                   int position = random.nextInt(i + 1);
                   arr[i] = arr_temp[position];
                   arr_temp[position] = arr_temp[i];
                }
                // arr[0] = arr_temp[0];
                return arr;
            };
    private BiFunction<Integer, Integer, int[]> stream_array_int_unordered_generate =
            (Integer start, Integer end) -> {
                int[] arr = IntStream.rangeClosed(start, end).toArray();
                Random random = new Random();
                for (int i = arr.length - 1; i > 0; i--) {
                    int position = random.nextInt(i + 1);
                    int temp = arr[position];
                    arr[position] = arr[i];
                    arr[i] = temp;
                }
                return arr;
            };
}

说明

  • 生成基础数组没有使用任何方法,因为使用函数数式接口,就可以只定义属性,而可以不再使用方法了
  • 在外部调用时,使用Lombok的getter方法就可以调用这些属性来生成基础数组
  • 这些接口,要接收两个入参start与end,分别表示数据开始与结束时的值,在数组中包括这两个值
  • 接口返回的数组,分为包装类型数组与基础类型数组
  • 后期再补写用Kotlin的代码
  • 上述属性特点都是一种函数式接口类型BiFunction<Integer, Integer, int[]>,这样写属性有一个重大好处,就是生成数组的名字不同,但类型是是相同,这样当使用这里生成的数组时,可以使用统一参数来完成,不必在算法代码中加入不同的方法名来调用不同的数组生成方法,这样代码的通用性就提高了,举例来说:
public void algorithm() {
    int[] arr = ...;//这里的...代表了生成数组的方法名,这里要硬编码,调用不同方法就要修改方法名
    // 对数组arr执行排序等算法处理代码
}
public void algorithm_better(BiFunction<Integer, Integer, int[]> bi, ...) {//...代表其它参数
	int[] arr = bi.apply(a, b);//使用这种参数传入方式,可以不再有硬编码,数组生成方法被统一了
	// 对数组arr执行排序等算法处理代码
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值