Java Lambda表达式 List遍历、过滤、排序、去重

package springboot.activiti.demo.utils;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;

public class LambdaDemo {
	private static final Logger LOGGER = LoggerFactory.getLogger(LambdaDemo.class);

	public static void main(String[] args) {
		ArrayList<Person> arrayList = new ArrayList<>();
		for (int i = 0; i < 10; i++) {
			Person person = new Person("Tom" + i, i + 10, i % 2 == 0 ? 0 : 1);
			arrayList.add(person);
		}
		// 原始数据
		LOGGER.info("===原来arrayList===:{}", JSON.toJSON(arrayList));
		// 重新创建一个List
		List<Person> newList = arrayList.stream().collect(Collectors.toList());
		// 循环输出
		newList.stream().forEach(p -> {
			LOGGER.info("=person=  名字:{} -年龄:{} -性别:{}", p.getName(), p.getAge(), p.getSex() == 0 ? "男" : "女");
		});

		// 只获取男生
		List<Person> boys = newList.stream().filter(p -> p.getSex() == 0).distinct().collect(Collectors.toList());
		boys.stream().forEach(p -> {
			LOGGER.info("=boys=  名字:{} -年龄:{} -性别:{}", p.getName(), p.getAge(), p.getSex() == 0 ? "男" : "女");
		});
		// 获取年龄大于16的
		List<Person> more16List = newList.stream().filter(p -> Integer.valueOf(p.getAge()) > 16).distinct()
				.collect(Collectors.toList());
		more16List.stream().forEach(p -> {
			LOGGER.info("=more16List=  名字:{} -年龄:{} -性别:{}", p.getName(), p.getAge(), p.getSex() == 0 ? "男" : "女");
		});

		// 性别排序
		List<Person> sexList = newList.stream().sorted((p1, p2) -> p1.getSex().compareTo(p2.getSex()))
				.collect(Collectors.toList());
		sexList.stream().forEach(p -> {
			LOGGER.info("=sexList=  名字:{} -年龄:{} -性别:{}", p.getName(), p.getAge(), p.getSex() == 0 ? "男" : "女");
		});

		// 年龄倒序
		Comparator<Person> comparator = (p1, p2) -> p1.getAge().compareTo(p2.getAge());
		newList.sort(comparator.reversed());
		newList.stream().forEach(p -> {
			LOGGER.info("=年龄倒序=  名字:{} -年龄:{} -性别:{}", p.getName(), p.getAge(), p.getSex() == 0 ? "男" : "女");
		});

		// 多条件排序
		newList.sort(Comparator.comparing(Person::getSex).thenComparing(Person::getAge).reversed());
		newList.stream().forEach(p -> {
			LOGGER.info("多条件排序  名字:{} -年龄:{} -性别:{}", p.getName(), p.getAge(), p.getSex() == 0 ? "男" : "女");
		});
		// 性别分组
		Map<Integer, List<Person>> sexGroup = newList.stream().collect(Collectors.groupingBy(Person::getSex));
		LOGGER.info("sexGroup:{}", sexGroup);

		// 对象去重,必须重写hasCode, equals方法
		Person person1 = new Person("Tom", 10, 0);
		Person person2 = new Person("Tom2", 16, 0);
		Person person3 = new Person("Mary", 15, 1);
		Person person4 = new Person("Tom", 10, 0);
		Person person5 = new Person("Mary", 15, 1);
		arrayList = new ArrayList<>();
		arrayList.add(person1);
		arrayList.add(person2);
		arrayList.add(person3);
		arrayList.add(person4);
		arrayList.add(person5);

		arrayList.stream().forEach(p -> {
			LOGGER.info("=对象去重原来List=  名字:{} -年龄:{} -性别:{}", p.getName(), p.getAge(), p.getSex() == 0 ? "男" : "女");
		});

		// 去重
		List<Person> collect = arrayList.stream().distinct().collect(Collectors.toList());
		collect.stream().forEach(p -> {
			LOGGER.info("=去重后List=  名字:{} -年龄:{} -性别:{}", p.getName(), p.getAge(), p.getSex() == 0 ? "男" : "女");
		});

	}

}

class Person {

	private String name;
	private Integer age;
	private Integer sex;

	public Person(String name, Integer age, Integer 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 Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public Integer getSex() {
		return sex;
	}

	public void setSex(Integer sex) {
		this.sex = sex;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + ((sex == null) ? 0 : sex.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (sex == null) {
			if (other.sex != null)
				return false;
		} else if (!sex.equals(other.sex))
			return false;
		return true;
	}

}
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 使用lambda表达式可以方便地遍历List。在Java中,可以使用stream()方法将List转换为流,然后使用forEach()方法对每个元素进行操作。例如,可以使用以下代码使用lambda表达式遍历循环List: userList.stream().forEach(user ->{ System.out.println("user值:"+user.toString()); }); 这段代码将打印出List中每个元素的值。\[1\]另外,还可以使用双冒号操作符(::)来简化lambda表达式的写法。例如,可以使用以下代码使用双冒号操作符遍历List: list.forEach(System.out::println); 这段代码将打印出List中每个元素的值。\[2\]Lambda表达式是一个匿名函数,可以用于表示闭包,它没有函数名。Lambda表达式基于数学中的λ演算得名,可以方便地进行函数式编程。\[3\] #### 引用[.reference_title] - *1* *3* [Lambda表达式处理List的常用操作](https://blog.csdn.net/qq_756589808/article/details/89356204)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Lambda表达式遍历List](https://blog.csdn.net/zh137289/article/details/85122599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值