关于函数式编程的一些理解
函数式编程是时下比较流行的编程方式了,很多新兴的编程语言都对函数式编程有了比较好的支持,她有别于传统的命令式编程,可以将函数(执行代码的过程)作为参数进行传递。JAVA也意识到了函数式编程的重要性,在2014年Oracle终于发布了JAVA8的版本,增加了诸如函数式编程、Lambda表达式、Stream流等新的特性,正因为有了这些新的功能,我们以后在编写JAVA代码的时候,有了一种新的选择。
熟练地使用函数式编程开发,可以让代码变得更简洁、优雅,可读性也能更强。但是,从命令式编程转向函数式编程还是需要一定努力的,因为在编码的思路上,两种开发模式真的有很大的区别,这也是有相当一部分的JAVA开发者还是比较热衷于使用传统的开发方式的原因。
尽管如此,函数式编程始终是以后编码开发的方向,因为她更优雅且开发效率会更高,所以我觉得现在就应该开始多熟悉函数式编程了哦,以后一定会用上的。对于Lambda表达式,我也还是处在初学者的状态,用起来感觉很不方便,往往当我有某个明确目标的时候,我却不知道使用何种方法或如何使用该方法来达到自己的目的。因此,最近我自己也在做一些Lambda的例子,帮助我去学习,效果还行,在这里也是想做一下分享,欢迎指正。
lambda表达式的例子
一、关于stream、filter、map、reduce
public static void main(String[] args) { List<String> list = Arrays.asList("max","min","vue","java","scala"); long sum = list.stream().filter(str -> str.startsWith("m")).count(); System.out.println("以m开头的数量是:" + sum); int sum2 = list.stream().mapToInt(String::length).reduce((s,item) -> s + item).getAsInt(); System.out.println("所有字母的长度总和:" + sum2); int sum3 = list.stream().filter(str -> str.startsWith("m")).mapToInt(String::length).reduce((s,item) -> s + item).getAsInt(); System.out.println("以m开头的单词总长度:" + sum3); }
1.stream()方法为集合打开了一个流,于是通过这个流,开发者就可以操作诸如过滤、映射、分组、计算等一系列的操作了。
2.filter()即是过滤的方法,在第一个例子中,找出以m字母开头的单词,并过滤成了新的流,然后计算单词的数量。
3.mapToInt()是映射的方法,根据单词的长度映射成了新的流,新的流中是一个关于单词长度的集合。
4.reduce()是计算的方法,根据单词长度集合的流,将单词长度进行相加,返回最终结果。
二、关于collect、groupingBy
创建一个User类,方便以后我们加到集合中
public class User { private String name; private int age; private int sex; public User(){ } public User(String name, int age) { super(); this.name = name; this.age = age; } public User(String name, int age,int sex) { super(); this.name = name; this.age = age; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", sex=" + sex + "]"; } }
生成一个List工具类,用于生成User集合
import java.util.ArrayList; import java.util.List; public class ListUtil { public static List getUserList(){ User u1 = new User("lilei",20,1); User u2 = new User("limei",31,1); User u3 = new User("min",12,0); User u4 = new User("max",33,0); User u5 = new User("test",35,0); List list = new ArrayList(); list.add(u1); list.add(u2); list.add(u3); list.add(u4); list.add(u5); return list; } }
在上述类的帮助下,写一个针对新建集合和分组的例子
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class SecondTest { /** * 获取每个用户的年龄,生成新数组,并打印 */ @SuppressWarnings("unchecked") private static void getAllUserAge(){ List<User> list = ListUtil.getUserList(); //获取每个用户的年龄,生成新数组,并打印 System.out.println("\n"); List ageList2 = list.stream().map(User::getAge).collect(Collectors.toList()); ageList2.stream().forEach(obj -> { System.out.print(obj + "\t"); }); System.out.println("\n"); } /** * 按性别分类,计算年龄总和 */ @SuppressWarnings("unchecked") public static void getManUserAgeSum(){ List<User> list = ListUtil.getUserList(); list.forEach(user -> System.out.println(user)); Map map = list.stream().collect(Collectors.groupingBy(User::getSex,Collectors.reducing(0,User::getAge,Integer::sum))); map.forEach((k,v)->System.out.println("k: "+ k + " v: "+v)); } @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) { //获取每个用户的年龄,生成以年龄组成的新数组 getAllUserAge(); //按性别分类,计算年龄总和 getManUserAgeSum(); } }
1.getAllUserAge()方法获取每个用户的年龄,并将用户的年龄组成一个新的集合,collect(Collectors.toList())用于将流转成ArrrayList类。
2.getManUserAgeSum()方法,将所有用户按性别进行分类,并计算了每个性别的年龄之和。通过groupingBy方法实现,在这里groupingBy()接收两个参数,第一个参数指定group by 的目标,第二个参数表示分组之后,需要进行的操作。最后,方法会返回一个Map对象,性别是键,年龄之和就是值。
相关推荐
Lambda表达式是Java函数式编程的核心,它允许我们将匿名函数作为方法参数或赋值给变量。Lambda表达式的语法形式为`参数列表 -> 表达式或代码块`。例如,一个接受两个整数并返回它们之和的Lambda表达式可以写作`(int...
- **函数式编程**:Java 8引入了`java.util.Function`等接口,以及`Stream API`,允许开发者使用lambda表达式进行函数式编程,如映射、过滤、聚合等操作。 4. **并行处理**:通过`java.util.concurrent.ForkJoin...
Java 1.8引入了lambda表达式,这是Java语言的一项重大改进,显著提升了代码的简洁性和可读性,尤其在处理函数式编程场景时。Lambda表达式是Java 8对函数式接口支持的核心组成部分,它允许我们将代码块视为一种值,...
1、Lambda表达式概述:了解Lambda表达式的定义、语法和变量捕获机制,以及为什么要在Java中引入Lambda表达式来支持函数式编程。 2、函数式接口与Lambda表达式:学习如何使用Lambda表达式与不同类型的函数式接口进行...
#### 一、Lambda表达式:Java中的函数式编程基石 Lambda表达式是Java 8引入的一个重要特性,它为Java带来了函数式编程的能力。在此之前,Java一直被认为是一种纯粹的面向对象编程语言。随着Lambda表达式的加入,...
Java 8 引入了Lambda表达式,这是对传统编程方式的一大革新,它极大地简化了函数式编程,尤其是在处理集合和并发操作时。Lambda表达式是Java 8中的一种语法糖,它允许开发者以更简洁的方式定义无状态、无副作用的...
Java 8提供了一些内置的函数式接口,如`Runnable`、`Callable`、`Consumer`、`Supplier`、`Function`、`Predicate`和`BiFunction`等,这些接口极大地丰富了函数式编程的能力。 1. `Runnable`:无参数,无返回值的...
Java Lambda表达式是Java 8引入的一个重要特性,它极大地简化了函数式编程风格的实现。Lambda表达式允许我们将函数作为一个值传递,就像传递其他数据类型一样。这在处理集合、事件驱动编程以及多线程等场景下尤其...
另一个应用场景是函数式编程。在某些场景下,我们可能需要动态生成一系列`lambda`函数,根据用户的输入或其他条件进行计算。例如,可以使用字符串数组,将每个字符串转换为`lambda`,然后应用到数据集上。 总结起来...
Lambda表达式是Java 8引入的一项重要特性,它极大地简化了函数式编程,使Java开发者能够更好地利用多核处理器的优势,提升程序的并行性能。以下是关于这一主题的详细知识讲解: 1. **Lambda表达式基础**:Lambda...
Java 8 的 Lambda 表达式是 Java 编程语言的重大革新,它引入了一种新的函数式编程概念,使得代码更加简洁、可读性更强。Lambda 表达式允许我们将函数作为一个方法参数,或者把函数作为方法返回值,极大地简化了处理...
Lambda表达式是Java 8引入的一种函数式编程概念,它允许我们将函数作为一个值传递,这在处理匿名函数时非常有用。Lambda表达式的语法结构如下: ```java (参数列表) -> {函数体} ``` 例如,我们可以用Lambda表达式...
Java 8对集合框架进行了扩展,引入了`Stream API`,提供了丰富的函数式编程操作,如`filter()`, `map()`, `reduce()`等,使得对数据的处理变得更加高效且易读。此外,集合接口如`List`, `Set`, `Map`也添加了默认...
总结来说,Lambda表达式是Java 8的一个重要创新,它通过简化单方法接口的实现,增强了Java的函数式编程能力,使得代码更加简洁、易读,并为处理复杂数据结构和并行计算提供了便利。熟练掌握Lambda表达式,对于提升...
Java 8引入了Lambda表达式,这是一种强大的新特性,它为Java编程语言带来了函数式编程的概念。Lambda表达式允许程序员创建匿名函数,即没有名称的函数,这些函数可以直接作为值传递给方法或存储在变量中。这使得代码...
Lambda 表达式是编程语言中的一种功能强大的工具,它主要出现在支持函数式编程特性的语言中,如C#、Java等。Lambda表达式本质上是一种匿名函数,即没有名字的函数,它可以用来传递代码或者在运行时动态创建。在C#中...
8. **函数式编程思维** - Lambda 有助于将程序设计从过程式转变为函数式,强调数据处理而不是控制流程。 总结,Lambda 表达式是 Java 8 的重要创新,它使得代码更简洁、可读性更强,尤其在处理集合和并发时。熟练...
Java 8 的 Lambda 表达式是 Java 语言的一个重大更新,它引入了一种新的编程范式,使得函数式编程在 Java 中变得更为简洁和高效。Lambda 表达式允许我们将函数作为一个对象来处理,这在处理集合、事件驱动、多线程等...
Java Lambda表达式是Java 8引入的一个重要特性,它极大地简化了函数式编程,并使得代码更加简洁、易读。在传统的面向对象编程中,我们通常通过创建对象并调用其方法来解决问题。而函数式编程则更注重结果,不关心...
Stream API 是 Java 8 中另一个重要的新增特性,它提供了新的数据处理方式,支持函数式编程风格。Stream 可以看作是一种对集合元素进行顺序或并行操作的序列。 ##### Stream 的基本概念 - **源**:数据源,可以是...