0
点赞
收藏
分享

微信扫一扫

Lambda表达式和方法引用综合案例(获取年龄最大的两个用户的 姓)

朱悟能_9ad4 2022-04-05 阅读 7
javaeclipse

已知以下集合,请完成以下功能
List<User> ps = Arrays.asList(
    new User(1, "张三", 31, 1000),
    new User(2, "李四", 26, 12000),
    new User(3, "王五", 18, 8000),
    new User(4, "赵六", 21, 3000),
    new User(5, "钱七", 45, 31000),
    new User(6, "老八", 16, 10000),
    new User(7, "老九", 23, 30000),
    new User(8, "小七", 31, 9000)
);

//对应实体类:
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private Integer salary;
   //getter,setter,有参无参,toString()
}
A.获取所有数据,过滤掉第一条和最后一条
B.获取薪水最高的用户信息
C.获取年龄最大的两个用户的姓名

D..获取年龄最大的两个用户的 姓

package User05;


import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

// 测试类
public class UserTest {
	public static void main(String[] args) {
		//创建一个集合对象
		List<User> ps = Arrays.asList( // 讲学生类的数组 转成 集合
				new User(1, "张三", 31, 1000),
				new User(2, "李四", 26, 12000),
				new User(3, "王五", 18, 8000),
				new User(4, "赵六", 21, 3000),
				new User(5, "钱七", 45, 31000),
				new User(6, "老八", 16, 10000),
				new User(7, "老九", 23, 30000),
				new User(8, "小七", 31, 9000)
			);
		
		// 将集合转换成成流
		// A.获取所有数据,过滤掉第一条和最后一条
		Stream<User> s = ps.stream();
		ps.stream().skip(1).limit((ps.size())-2).forEach(System.out::println);
		
		
		//B.获取薪水最高的 用户信息   
		// 第一种方式
		ps.stream().sorted((s1,s2) -> s2.getSalary() - s1.getSalary()).limit(1).forEach(System.out::println);
		
		// 第二种方式
		Optional<User> collect = ps.stream().collect(Collectors.maxBy(Comparator.comparing(User::getSalary))) ;
		System.out.println("薪水最高的用户信息:"+collect);
		
		//C.获取年龄最大的两个用户的 姓 
			
		// 第一种方式
		/*ps.stream().sorted(new Comparator<User>() {//先进行排序再进行获取每个用户的名字的首字母

			@Override
			public int compare(User o1, User o2) {
				// TODO Auto-generated method stub
				return o2.getAge() - o1.getAge();// 排序
			}
		}).map(new Function<User, String>() { //T是User类(因为要利用User类进行调用get/set方法),返回值类型是String类型

			@Override
			public String apply(User t) {
				// String substring(int beginIndex, int endIndex) 返回一个字符串,该字符串是此字符串的子字符串。 
				return t.getName().substring(0,1);//获取字符串中的第一个字符
				
				// 有个问题就是有两个一样的年纪的人怎么办 小七也是第2大的
			}
		}).limit(2).forEach(System.out::println);*/
		
		// lambda表达式进行简化
		
		ps.stream().sorted((o1, o2) -> o2.getAge() - o1.getAge()).map( t -> t.getName().substring(0,1)).limit(2).forEach(System.out::println);
		
		// 第二种方式就是没用匿名内部类改用调用Comparator的comparing方法而已
		
		ps.stream().sorted(Comparator.comparing(User::getAge)).map( t -> t.getName().substring(0,1)).skip(ps.size()-2).limit(2).forEach(System.out::println);				
	}
}
// 用户类
//定义一个用户类
 class User {
	//成员变量
	private Integer id;
	private String name;
	private Integer age;
	private Integer salary;
	
	//构造方法
	public User() {
		// TODO Auto-generated constructor stub
	}

	public User(Integer id, String name, Integer age, Integer salary) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.salary = salary;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	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 getSalary() {
		return salary;
	}

	public void setSalary(Integer salary) {
		this.salary = salary;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", age=" + age + ", salary=" + salary + "]";
	}
}

举报

相关推荐

0 条评论