欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java函数式编程Lambda表达式的示例(一)

程序员文章站 2022-04-17 23:19:34
...

       关于函数式编程的一些理解

       函数式编程是时下比较流行的编程方式了,很多新兴的编程语言都对函数式编程有了比较好的支持,她有别于传统的命令式编程,可以将函数(执行代码的过程)作为参数进行传递。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对象,性别是键,年龄之和就是值。