网站首页 > 编程文章 正文
标题是javashop小刘对自己说的,做为一个程序员虽然只有短短几年,但是每个版本的新特性没有掌握,现在还是一个基层业务开发者,有点挫败。最近开始看书,了解一些原理的东西,借用老板的一句话,写代码要写的有艺术~
替换匿名类
学习java lambda,首先要了解 的就是使用lambda表达式替换匿名类,那就是用“() -> {}”代码块替代了整个匿名类。
例子:
// Java 8之前: new Thread(new Runnable() { @Override public void run() { System.out.println("Before Java8, too much code for too little to do"); } }).start(); // Java 8方式: new Thread(() -> System.out.println("In Java8, Lambda expression !!") ).start(); // 传递参数: (String str) -> System.out.println(str)
lambda表达式对列表进行迭代
针对集合类,最常见的操作就是进行迭代,接下来展示如何进行列表循迭代。
// Java 8之前: List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API"); for (String feature : features) { System.out.println(feature); } // Java 8之后: List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API"); features.forEach(n -> System.out.println(n)); // 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示 features.forEach(System.out::println);
除了在语言层面支持函数式编程风格,Java 8也添加了一个包,叫做 java.util.function。它包含了很多类,用来支持Java的函数式编程。其中一个便是Predicate,Predicate接口非常适用于做过滤。
public static void main(String[] args) { List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp"); // 开头为J System.out.println("Languages which starts with J :"); filter(languages, (str) -> ((String) str).startsWith("J")); // 结尾为 a System.out.println("Languages which ends with a "); filter(languages, (str) -> ((String) str).endsWith("a")); // true System.out.println("Print all languages :"); filter(languages, (str) -> true); // false System.out.println("Print no language : "); filter(languages, (str) -> false); // 长度大于4 System.out.println("Print language whose length greater than 4:"); filter(languages, (str) -> ((String) str).length() > 4); } public static void filter(List<String> names, Predicate condition) { // for (String name : names) { // if (condition.test(name)) { // System.out.println(name + " "); // } // } // 用lambda 迭代替换原本的for循环 names.stream().filter((name) -> (condition.test(name))).forEach((name) -> { System.out.println(name + " "); }); }
lambda表达式中加入Predicate
Predicate条件判断通常不是说一个条件,而是有或/且的关系,那么在lambda中,用方法or/and来实现,
如下:
Predicate<String> startsWithJ = (n) -> n.startsWith("J"); Predicate<String> fourLetterLong = (n) -> n.length() == 4; names.stream().filter( startsWithJ.and(fourLetterLong.or(startsWithJ))) .forEach((n) -> System.out.print("nName, which starts with 'J' and four letter long is : " + n));
Java 8中使用lambda表达式的List Map的处理.
list处理。
// 不使用lambda表达式为每个订单加上12%的税 List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);for (Integer cost : costBeforeTax) { cost = cost + .12*cost; } // 使用lambda表达式 List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); costBeforeTax.stream().map((cost) -> cost = (int) (cost + .12*cost)).forEach(System.out::println);
reduce() 函数可以将所有值合并成一个。Map和Reduce操作是函数式编程的核心操作,因为其功能,reduce 又被称为折叠操作。另外,reduce 并不是一个新的操作,你有可能已经在使用它。SQL中类似 sum()、avg() 或者 count() 的聚集函数,实际上就是 reduce 操作,因为它们接收多个值并返回一个值。流API定义的 reduceh() 函数可以接受lambda表达式,并对所有值进行合并。IntStream这样的类有类似 average()、count()、sum() 的内建方法来做 reduce 操作,也有mapToLong()、mapToDouble() 方法来做转换。这并不会限制你,你可以用内建方法,也可以自己定义。在这个Java 8的Map Reduce示例里,我们首先对所有价格应用 12% 的VAT,然后用 reduce() 方法计算总和。
// 为每个订单加上12%的税// 老方法: List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); double total = 0;for (Integer cost : costBeforeTax) { double price = cost + .12*cost; total = total + price; } System.out.println("Total : " + total); // 新方法: List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost).reduce((sum, cost) -> sum + cost).get();System.out.println("Total : " + bill);
lambda 做一个字符串过滤
List<String> strList = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp"); List<String> filtered = strList.stream().filter(x -> x.length() > 3).collect(Collectors.toList()); filtered.forEach(n -> System.out.println(n));
输出 Java Scala Haskell Lisp
对列表元素的函数使用
实际代码中免不了循环对集合中的对象进行加工,这里则演示这个点。
// 将字符串换成大写并用逗号链接起来 List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada"); String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", ")); System.out.println(G7Countries);
输出 USA, JAPAN, FRANCE, GERMANY, ITALY, U.K., CANADA
以上内容基本可以满足日常使用,还需要了解其他的话可以看一下官方文档,以及一些其他人的研究,愿大家的代码写的更优美。
猜你喜欢
- 2024-09-09 Java JDK11 在Linux上的安装和配置
- 2024-09-09 一份详细介绍JVM的资料(对比JDK8和JDK7)
- 2024-09-09 应用服务器安装指南(应用服务器安装指南下载)
- 2024-09-09 [信创]SpringBoot3 JDK17 整合 MyBatis + 达梦DM8(一)
- 2024-09-09 浅谈 Java线程状态转换及控制(java线程状态转换图)
- 2024-09-09 jdk 1.8 stream基本用法(jdk8 stream map)
- 2024-09-09 jdk安装、配置文档(jdk安装配置教程)
- 2024-09-09 2021年官网下载各个版本JDK最全版与官网查阅方法
- 2024-09-09 11.2.JDK5~JDK8各个版本新特性(jdk8u5)
- 2024-09-09 JAVA零基础入门:JDK的概述及安装(jdk安装教程2020)
你 发表评论:
欢迎- 06-24一个老爸画了超级有爱的365幅画 | 父亲节献礼
- 06-24产品小白看魏则西事件——用产品思维审视百度推广
- 06-24某教程学习笔记(一):13、脚本木马原理
- 06-24十大常见web漏洞——命令执行漏洞
- 06-24初涉内网,提权那些事(内网渗透提权)
- 06-24黑客命令第16集:47种最常见的**网站方法2/2
- 06-24铭说 | 一句话木马的多种变形方式
- 06-24Java隐藏的10倍效率技巧!90%程序员不知道的魔法方法(附代码)
- 最近发表
- 标签列表
-
- spire.doc (70)
- instanceclient (62)
- solidworks (78)
- system.data.oracleclient (61)
- 按键小精灵源码提取 (66)
- pyqt5designer教程 (65)
- 联想刷bios工具 (66)
- c#源码 (64)
- graphics.h头文件 (62)
- mysqldump下载 (66)
- libmp3lame (60)
- maven3.3.9 (63)
- 二调符号库 (57)
- git.exe下载 (68)
- diskgenius_winpe (72)
- pythoncrc16 (57)
- solidworks宏文件下载 (59)
- qt帮助文档中文版 (73)
- satacontroller (66)
- hgcad (64)
- bootimg.exe (69)
- android-gif-drawable (62)
- axure9元件库免费下载 (57)
- libmysqlclient.so.18 (58)
- springbootdemo (64)
本文暂时没有评论,来添加一个吧(●'◡'●)