博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 8 常用功能实践整理
阅读量:6633 次
发布时间:2019-06-25

本文共 4498 字,大约阅读时间需要 14 分钟。

1. 对象排序

void ...sort(<? super > c);

int compare(T o1, T o2);

public static <T, U extends Comparable<? super U>> Comparator<T> comparing(

            Function<? super T, ? extends U> keyExtractor);

default void forEach(Consumer<? super T> action);

List
inventory = Arrays.asList(new Apple(80,"green"), new Apple(155, "green"), new Apple(120, "red")); //集合排序(倒序)inventory.sort((Apple a1,Apple a2) -> a2.getWeight().compareTo(a1.getWeight())); //顺序排序 inventory.sort(Comparator.comparing(Apple::getWeight)); inventory.forEach(n -> System.out.println(n.toString()));

2. 集合过滤

//集合过滤List
apples = inventory.stream().filter((Apple a) -> a.getColor().equals("green")).collect(Collectors.toList());

3. 修改集合元素内容

apples.forEach(n -> {
//if(n.getWeight() == 120) n.setWeight(333);});

 4. 读取文件

//中文问题 %e6%9d%a8%e9%a3%9e    System.out.println(ExecuteAround.class.getClassLoader().getResource("lambdasinaction/chap3/data.txt").getPath());System.out.println(ExecuteAround.class.getClassLoader().getResource("lambdasinaction/chap3/data.txt").toURI().getPath());String result = processFileLimited();System.out.println(result);System.out.println("---"); /*** lambda表达式用在函数式接口作为参数的方法中,用来替代函数式接口中的唯一的一个抽象方法,抽象方法签名和lambda表达式签名一致*/String oneLine = processFile((BufferedReader b) -> b.readLine());System.out.println(oneLine);String twoLines = processFile((BufferedReader b) -> b.readLine() + b.readLine());System.out.println(twoLines);public static String processFileLimited() throws IOException, URISyntaxException {        try (BufferedReader br =                     new BufferedReader(new FileReader(ExecuteAround.class.getClassLoader().getResource("lambdasinaction/chap3/data.txt").toURI().getPath()))) {            return br.readLine();        }    }    public static String processFile(BufferedReaderProcessor p) throws IOException, URISyntaxException {        try(BufferedReader br = new BufferedReader(new FileReader(ExecuteAround.class.getClassLoader().getResource("lambdasinaction/chap3/data.txt").toURI().getPath()))){            return p.process(br);        }    }    public interface BufferedReaderProcessor{        public String process(BufferedReader b) throws IOException;    }

 5. 方法引用解析(不仅仅用于单参数lambda)

  方法引用可以被看作仅仅调用特定方法的Lambda的一种快捷写法,如果一个Lambda代表的只是“直接调用这个方法”,那最好还是用名称来调用它,而不是去描述如何调用它.方法引用就是让你根据已有的方法实现来创建Lambda表达式,使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面.

  例如,Apple::getWeight就是引用了Apple类中定义的方法getWeight,方法引用就是Lambda表达式(Apple a) -> a.getWeight()的快捷写法。

  方法引用其实和lambda是对应的,参数对应目标引用类型,返回值对应方法返回值.

 

 6. list 转 map java8分组

List
list = attachDao.findByTarget(toIds); Map
> ret = new HashMap<>(); //list.stream().map(n -> BeanMapUtils.copy(n)).collect(Collectors.groupingBy(Attach::getId)); list.forEach(po -> { Attach a = BeanMapUtils.copy(po); List
ats = ret.get(a.getToId()); if (ats == null) { ats = new ArrayList<>(); ret.put(a.getToId(), ats); } ats.add(a); });

 

常用方式代码如下:public Map
getIdNameMap(List
accounts) { return accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsername));}收集成实体本身map代码如下:public Map
getIdAccountMap(List
accounts) { return accounts.stream().collect(Collectors.toMap(Account::getId, account -> account));}account -> account是一个返回本身的lambda表达式,其实还可以使用Function接口中的一个默认方法代替,使整个方法更简洁优雅:public Map
getIdAccountMap(List
accounts) { return accounts.stream().collect(Collectors.toMap(Account::getId, Function.identity()));}重复key的情况代码如下:public Map
getNameAccountMap(List
accounts) { return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity()));}这个方法可能报错(java.lang.IllegalStateException: Duplicate key),因为name是有可能重复的。toMap有个重载方法,可以传入一个合并的函数来解决key冲突问题:public Map
getNameAccountMap(List
accounts) { return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2));}这里只是简单的使用后者覆盖前者来解决key重复问题。指定具体收集的maptoMap还有另一个重载方法,可以指定一个Map的具体实现,来收集数据:public Map
getNameAccountMap(List
accounts) { return accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2, LinkedHashMap::new));}

 

转载于:https://www.cnblogs.com/yangfei-beijing/p/6486494.html

你可能感兴趣的文章
接口幂等
查看>>
【常用工具】常用工具收集
查看>>
第二阶段团队冲刺站立会议06
查看>>
html
查看>>
本地wampserver如何配置伪静态
查看>>
C#串口通信实例
查看>>
小程序数据返回时刷新当前页面数据
查看>>
jFinal 关联数据库操作
查看>>
团队冲刺第二天
查看>>
sed删除空行和开头的空格和tab键
查看>>
php扩展安装
查看>>
15个重要的Android代码
查看>>
(转)android 牛人必修 ant 编译android工程
查看>>
求最大公约数与最小公倍数
查看>>
C# Winform 跨线程更新UI控件常用方法总结(转)
查看>>
【WebService】使用jaxb完成对象和xml的转换
查看>>
如何去除My97 DatePicker控件上右键弹出官网的链接 - 如何debug混淆过的代码
查看>>
输入5个学生的信息(包括学号,姓名,英语成绩,计算机语言成绩和数据库成绩), 统计各学生的总分,然后将学生信息和统计结果存入test.txt文件中...
查看>>
BZOJ2337 [HNOI2011]XOR和路径
查看>>
C# 该行已经属于另一个表 ...
查看>>