举报投诉联系我们 手机版 热门标签 VUE中文网
您的位置:VUE中文网 > java 参数化类型 Java Lambda行为参数化

java 参数化类型 Java Lambda行为参数化

2023-04-26 07:17 Java教程

java 参数化类型 Java Lambda行为参数化

java 参数化类型

Java 参数化类型是 Java 5 中引入的一种新的特性,它可以让我们在编写代码时使用更加灵活的方式来处理不同的数据类型。它可以让我们在定义一个方法或者一个类时,使用一个参数来表示不同的数据类型,而不是固定地使用一个特定的数据类型。

Java 参数化类型有很多优势,首先,它可以让我们在定义一个方法或者一个类时,使用更加通用的方式来处理不同的数据类型。例如,如果我们想要创建一个能够处理所有集合对象的方法,那么就可以使用 Java 参数化类型来定义这样一个方法。

public void processCollection(Collection<T> collection) { 
    // do something with the collection 
}

此外,Java 参数化类型还可以帮助我们避免重复代码。例如,如果我们想要创建一个能够处理所有集合对象的方法,那么就可以使用 Java 参数化类型来定义这样一个方法,而不必重新写相同的代码来处理不同的集合对象。

public void processCollection(Collection<T> collection) { 
    for (T element : collection) { 
        // do something with the element 
    } 
}

此外,Java 参数化类型还可以帮助我们避免出错。例如,如果在创建集合对象时忘记了声明该集合对象所存储元素的具体数据类型时,尽量使用 Java 参数化 的形式来声明该集合对象所存储元 素 的 数 据 类 型 ; 这 样 , 既 能 避 免 错 误 ; 也 能 够 有 效 的 限 制 集 合 对 象 所存储元 素 的 数 据 种 种 。

Java Lambda行为参数化

Java Lambda行为参数化


我们可以将lambda表达式作为参数传递给方法。

例子

以下代码创建了一个名为 Calculator 的函数接口。

Calculator 中有一个称为 calculate 的方法,它接受两个 int 参数并返回一个 int 值。

Main 类中有一个引擎方法,它接受函数接口Calculator作为参数。它从计算器调用计算方法并输出结果。

在主方法中,我们用不同的lambda表达式调用引擎方法四次。

public class Main {
  public static void main(String[] argv) {
    engine((x,y)-> x + y);
    engine((x,y)-> x * y);
    engine((x,y)-> x / y);
    engine((x,y)-> x % y);
  }
  private static void engine(Calculator calculator){
    int x = 2, y = 4;
    int result = calculator.calculate(x,y);
    System.out.println(result);
  }
}

@FunctionalInterface
interface Calculator{
  int calculate(int x, int y);
}

上面的代码生成以下结果。

注意

engine 方法的结果取决于传递给它的lambda表达式。

引擎方法的行为被参数化。

通过其参数更改方法的行为称为行为参数化。

在行为参数化中,我们将在lambda表达式中封装的逻辑传递给数据的方法。

行为参数化模糊性

编译器并不总是可以推断lambda表达式的类型。

一种情况是将lambda表达式传递给重载的方法。

在以下代码中有两个函数接口。 一个是 int 值计算,另一个用于 long 值。

在Main类中有称为 engine 的重载方法。 一个是期望 IntCalculator ,另一个是 LongCalculator

在main方法中,我们必须指定lambda表达式的参数,以指示我们要使用的重载函数的编译器。

public class Main {
  public static void main(String[] argv) {
    engine((int x,int y)-> x + y);
    engine((long x, long y)-> x * y);
    engine((int x,int y)-> x / y);
    engine((long x,long y)-> x % y);
  }
  private static void engine(IntCalculator calculator){
    int x = 2, y = 4;
    int result = calculator.calculate(x,y);
    System.out.println(result);
  }
  private static void engine(LongCalculator calculator){
    long x = 2, y = 4;
    long result = calculator.calculate(x,y);
    System.out.println(result);
  }  
}

@FunctionalInterface
interface IntCalculator{
  int calculate(int x, int y);
}

@FunctionalInterface
interface LongCalculator{
  long calculate(long x, long y);
}

上面的代码生成以下结果。

注意1

要解决歧义,我们可以通过指定参数的类型将隐式lambda表达式更改为explicit。这是为上面的代码做的。

或者我们可以使用cast如下。当第一次调用引擎时,我们将lambda表达式转换为IntCalculator

public class Main {
  public static void main(String[] argv) {
    engine((IntCalculator) ((x,y)-> x + y));
    engine((long x, long y)-> x * y);
    engine((int x,int y)-> x / y);
    engine((long x,long y)-> x % y);
  }
  private static void engine(IntCalculator calculator){
    int x = 2, y = 4;
    int result = calculator.calculate(x,y);
    System.out.println(result);
  }
  private static void engine(LongCalculator calculator){
    long x = 2, y = 4;
    long result = calculator.calculate(x,y);
    System.out.println(result);
  }  
}

@FunctionalInterface
interface IntCalculator{
  int calculate(int x, int y);
}

@FunctionalInterface
interface LongCalculator{
  long calculate(long x, long y);
}

上面的代码生成以下结果。

注意2

或者我们可以避免直接使用lambda表达式作为参数。我们可以将lambda表达式分配给一个函数接口,然后将该变量传递给该方法。下面的代码显示了这种技术。

public class Main {
  public static void main(String[] argv) {
    IntCalculator iCal = (x,y)-> x + y;
    engine(iCal);
    engine((long x, long y)-> x * y);
    engine((int x,int y)-> x / y);
    engine((long x,long y)-> x % y);
  }
  private static void engine(IntCalculator calculator){
    int x = 2, y = 4;
    int result = calculator.calculate(x,y);
    System.out.println(result);
  }
  private static void engine(LongCalculator calculator){
    long x = 2, y = 4;
    long result = calculator.calculate(x,y);
    System.out.println(result);
  }  
}

@FunctionalInterface
interface IntCalculator{
  int calculate(int x, int y);
}

@FunctionalInterface
interface LongCalculator{
  long calculate(long x, long y);
}

上面的代码生成以下结果。

阅读全文
以上是VUE中文网为你收集整理的java 参数化类型 Java Lambda行为参数化全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 VUE中文网 vue88.com 版权所有 联系我们