首页  >  文章  >  Java  >  Java 中的函数式编程

Java 中的函数式编程

WBOY
WBOY原创
2024-08-30 16:03:56466浏览

Java 函数式编程在 Java 8th 版本之后出现。函数式编程意味着解决问题的方法发生了根本性的变化。函数式编程允许使用表达式(声明函数)、将函数作为参数传递以及使用函数作为语句进行编程。

函数式编程的类型

广告 该类别中的热门课程 编程语言 - 专业化 | 54 课程系列 | 4 次模拟测试

开始您的免费软件开发课程

网络开发、编程语言、软件测试及其他

  • 流函数式编程
  • Lambda 表达式函数式编程
  • 函数式编程方法参考

函数式编程在 Java 中是如何工作的?

在讨论函数式编程概念之前,让我们先看看函数式编程和结构化编程之间的区别。结构化编程强调逻辑结构或过程,而函数式编程主要关注数据。结构化编程遵循自上而下的方法,而函数式编程遵循自下而上的方法。

函数式编程被分为称为对象的微小运行时实体,而结构化编程则分为小单元或函数。结构化编程的安全性较低,而函数式编程的安全性很高。结构化编程无法处理复杂问题,而函数式编程可以处理任何级别的复杂问题。

Java 函数式编程示例

下面给出了提到的示例:

示例#1:流函数式编程

语法:

objectName.stream();

代码:

动物.java

package com.streams;
public class Animal {
String name;
String color;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Animal(String name, String color) {
super();
this.name = name;
this.color = color;
}
}

AnimalNames.java

package com.streams;//creating package
//importing required packages to the code
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class AnimalNames {
public static void main(String[] args) {
getMyDogNames();//calling the method
}
private static void getMyDogNames() {
Animal a1=new Animal("Puppy","black"); //creating a object for animal class
Animal a2=new Animal("Tommy","brown");//creating a object for animal class
Animal a3=new Animal("Zimmy","white");//creating a object for animal class
List<Animal> persons = Arrays.asList(a1,a2,a3); //passing object references to list
String dogName = persons.stream() //covert all elements into stream
.filter(name -> "Puppy".equals(name.getName()))//filtering given elements from persons class
.map(Animal::getName)     //persons elements iterate over map
.findAny()//find out the given element passed from filter
.orElse("");//
System.out.println("Dog Name :" + dogName); //print the dog name
List<String> collect = persons.stream()
.map(Animal::getName)
.collect(Collectors.toList());//collecting all names from list
System.out.println("All Dog names");
collect.forEach(System.out::println);//iterating collection with for each loop
}
}

输出:

Java 中的函数式编程

说明:

  • 在 Java 类中,我们生成 setter 和 getter。
  • 我们在Java类中编写了打印狗名字的主要代码。
  • 在代码本身中,在注释中提及每一行的用途。
  • 如果我们在结构化编程中编写相同的代码,我们需要为每个方法编写更多行,如filter()、collector()、findAny()、map()等。因此,大多数函数式编程开发优先于结构化编程。

示例 #2:Lambda 表达式

  • lambda 表达式用于用表达式来表示方法接口。
  • 它有助于迭代、过滤和从集合中提取数据。
  • Lambda 表达式接口实现是一个函数式接口。
  • 减少了大量代码。
  • lambda 表达式被视为函数,因此 java 编译器无法创建 .class

语法:

(arguments) ->
{
//code for implementation
}
Arguments:  argument-list can be have values or no values
Example: arguments1, arguments2, arguments3,……
->: Joins code implementation and arguments.
a.具有单个参数的 Lambda 表达式

语法:

(argument1) ->
{
//code for implementation
}
示例 – AreaOfSquare.java

代码:

package com.lambda;//creating a package
interface Square{  //creating interface for quare
public int getArea(int side);  //create a method for get area
}
public class AreaOfSquare{  //As we are working with Lambda expression so no need to implement interface of square
public static void main(String[] args) {
Square area=(side)->{  // Lambda expression with only one argument.
Return side*side;  //returning area
};
System.out.println(“Area of Square=>”+area.getArea(10));   //printing area by calling interface getArea method
}
}

输出:

Java 中的函数式编程

说明:

  • 上面创建了一个Square接口,并在AreaOfSquare类内部编写了lambda表达式。
  • 在 lambda 表达式中,编写正方形面积的逻辑。
  • 最后一行通过调用接口方法 getArea() 打印出 100 的正方形的面积。
b.  不带参数的 Lambda 表达式

语法:

() ->
{
//code for implementation
}
示例 – MyNameString.java

代码:

package com.lambda;//creating a package
interface Name{  //creating interface for Name
public String getMyName();  //create a method for get name
}
public class MyNameString{  //As we are working with Lambda expression so no need to implement interface of Name
public static void main(String[] args) {
Name name=()->{  // Lambda expression with out argument.
return "Hi, Amardeep!"; //returning name
};
System.out.println(name.getMyName());   //printing name by calling interface getMyName method
}
}

输出:

Java 中的函数式编程

说明:

  • 上面创建了一个接口 Name 并在 MyNameString 类中编写了不带参数的 lambda 表达式。
  • 在 lambda 表达式中,编写返回字符串的逻辑。
  • 在打印的最后一行中,字符串是 Hi, Amardeep!通过调用接口方法 getMyName().

示例 #3:方法参考

  • 方法引用用于引用函数式接口的方法。
  • 这是 lambda 表达式的一种更简单的形式。
  • 如果每次都使用lambda表达式来指向一个方法,我们可以使用方法引用来代替方法引用。

语法:

Class-Name:: static method name
示例 – StaticMethodReference.java

代码:

package method.reference;//creating package
interface RectangleArea{  //creating RectangleArea interface
public int getArea(int l,int b);  //creating method getArea in interface
}
public class StaticMethodReference {  //creating a classs
public static int showRectangleArea(int length, int breadth){  //creating method for getting rectangle area
return length*breadth;
}
public static void main(String[] args) {
// Referring static method
RectangleArea area = StaticMethodReference::showRectangleArea;  //calling class name with method name
// Calling interface method
int outArea=area.getArea(10,20);
System.out.println("Area of rectangle :"+outArea);//printing area
}
}

输出:

Java 中的函数式编程

说明:

  • 上面创建了一个接口 Rectangle,并在 StaticMethodReference 类内部编写了静态方法参考代码。
  • 在 showRectangleArea() 方法中,编写矩形面积的逻辑。
  • 下一行将静态方法引用传递给 RectangleArea 接口引用。
  • 接下来,通过调用 getArea(10,20) 方法来打印矩形区域。
  • 输出为 200。

结论

函数式编程是通过流、lambda 表达式和方法引用来实现的。它减少了代码行并提高了性能。

以上是Java 中的函数式编程的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
上一篇:Deque in Java下一篇:ClassLoader in Java