• java8 Stream API及Collectors类常用方法


    最近项目里streamAPI用的比较频繁,以前看过但是没怎么熟练使用,整理下常用的例子
    User对象用来作为测试数据中的基础类

    import java.io.Serializable;
    
    public class User implements Serializable {
    
    	private Long id;
    	private String userName;
    	private String userType;
    	private String groupType;
    	private String userCode;
    	private String userTemp;
    
    	public User(Long id, String userName, String userCode) {
    		this.id = id;
    		this.userName = userName;
    		this.userCode = userCode;
    	}
    
    	public Long getId() {
    		return id;
    	}
    
    	public void setId(Long id) {
    		this.id = id;
    	}
    
    	public String getUserName() {
    		return userName;
    	}
    
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    
    	public String getUserType() {
    		return userType;
    	}
    
    	public void setUserType(String userType) {
    		this.userType = userType;
    	}
    
    	public String getGroupType() {
    		return groupType;
    	}
    
    	public void setGroupType(String groupType) {
    		this.groupType = groupType;
    	}
    
    	public String getUserCode() {
    		return userCode;
    	}
    
    	public void setUserCode(String userCode) {
    		this.userCode = userCode;
    	}
    
    	public String getUserTemp() {
    		return userTemp;
    	}
    
    	public void setUserTemp(String userTemp) {
    		this.userTemp = userTemp;
    	}
    }
    
    

    常用操作如下:

    
    import java.util.*;
    import java.util.stream.Collectors;
    
    public class StreamApiDemo {
    
    	private List<User> initData() {
    		List<User> userList = new ArrayList<>();
    		String stringUserNameFormat = "userName: %s";
    		String userTypeFormat = "%s";
    		String groupTypeFormat = "groupType: %s";
    		String userCodeFormat = "userCode: %s";
    		for (int i = 0; i < 10; i++) {
    			User u = new User((long) i,
    					String.format(stringUserNameFormat, String.valueOf(i)),
    					String.format(userCodeFormat, String.valueOf(i)));
    			u.setGroupType(String.format(groupTypeFormat, i / 2 == 0 ? "even" : "odd"));
    			u.setUserType(String.format(userTypeFormat, i / 5 == 0 ? "0" : "1"));
    			userList.add(u);
    		}
    		return userList;
    	}
    
    	public static void main(String... args) {
    		StreamApiDemo streamApiDemo = new StreamApiDemo();
    		List<User> userList = streamApiDemo.initData();
    //		创建流
    		streamApiDemo.createStream();
    //		foreach
    		streamApiDemo.forEachDemo();
    //		Map操作
    		streamApiDemo.mapDemo(userList);
    //		filter操作
    		streamApiDemo.filterDemo(userList);
    //		limit操作
    		streamApiDemo.limitDemo(userList);
    //		sort操作
    		streamApiDemo.sortDemo(userList);
    //		collectors的toMap
    		streamApiDemo.collectorsToMapDemo(userList);
    //		collectors的groupingBy
    		streamApiDemo.collectorsGroupByDemo(userList);
    	}
    
    	/**
    	 * 根据对象的属性转换为map 如果key冲突根据k1值
    	 * toMap参数:
    	 * map中的key
    	 * map中的value
    	 * key冲突时返回的key
    	 *
    	 * @param list 测试集合
    	 */
    	private void collectorsToMapDemo(List<User> list) {
    		Map<String, User> userTypeMap = list.stream().collect(Collectors.toMap(User::getUserCode, a -> a, (k1, k2) -> k1));
    		for (String key : userTypeMap.keySet()) {
    			System.out.println(userTypeMap.get(key).getUserName());
    		}
    	}
    
    	/**
    	 * 根据指定的属性给集合对象分组并返回map
    	 *
    	 * @param list 测试集合
    	 */
    	private void collectorsGroupByDemo(List<User> list) {
    		Map<String, List<User>> userGroupMap = list.stream().collect(Collectors.groupingBy(User::getGroupType));
    		for (String key : userGroupMap.keySet()) {
    			List<User> userList = userGroupMap.get(key);
    			userList.forEach(u -> System.out.println(u.getUserName()));
    		}
    	}
    
    	/**
    	 * 根据条件进行排序
    	 * sorted的默认参数可以参考Comparator接口
    	 * reverseOrder自然逆序
    	 *
    	 * @param list 测试集合
    	 */
    	private void sortDemo(List<User> list) {
    		Random random = new Random(100);
    		list.forEach(u -> u.setUserTemp(String.valueOf(random.nextInt())));
    		List<User> userList = list.stream().sorted(Comparator.comparing(User::getUserTemp)).collect(Collectors.toList());
    		userList.forEach(u -> System.out.println(u.getUserName()));
    	}
    
    
    	/**
    	 * limit 方法用于获取指定数量的流
    	 *
    	 * @param list 测试集合
    	 */
    	private void limitDemo(List<User> list) {
    		List<User> userList = list.stream().limit(5).collect(Collectors.toList());
    		userList.forEach(u -> System.out.println(u.getUserName()));
    
    		list.stream().limit(5).forEach(u -> System.out.println(u.getUserName()));
    	}
    
    
    	/**
    	 * filter 方法用于通过设置的条件过滤出元素
    	 * 获取userType为1的数据
    	 * 获取userType为1的数量
    	 *
    	 * @param list 测试集合
    	 */
    	private void filterDemo(List<User> list) {
    		List<User> userList = list.stream().filter(u -> u.getUserType().equals("1")).distinct().collect(Collectors.toList());
    		userList.forEach(u -> System.out.println(u.getUserName()));
    		Long userListNum = list.stream().filter(u -> u.getUserType().equals("1")).count();
    		System.out.println(userListNum);
    
    	}
    
    	/**
    	 * stream() − 为集合创建串行流。
    	 * parallelStream() − 为集合创建并行流
    	 * 使用filter过滤
    	 */
    	private void createStream() {
    		List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
    		List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
    		filtered.forEach(System.out::println);
    	}
    
    	private void forEachDemo() {
    		Random random = new Random();
    		random.ints().limit(10).forEach(System.out::println);
    	}
    
    	/**
    	 * map 方法用于映射每个元素到对应的结果
    	 * 获取对象中属性并返回一个list
    	 *
    	 * @param list 测试集合
    	 */
    	private void mapDemo(List<User> list) {
    		List<String> userNameList = list.stream().map(User::getUserName).distinct().collect(Collectors.toList());
    		userNameList.forEach(System.out::println);
    	}
    }
    
  • 相关阅读:
    mybatis的延时加载缓存机制
    mybatis03
    事务
    codeforces-200B
    codeforces-339B
    codeforces-492B
    codeforces-266B
    codeforces-110A
    codeforces-887B
    codeforces-69A
  • 原文地址:https://www.cnblogs.com/GYoungBean/p/13553807.html
Copyright © 2020-2023  润新知