小小最近开始学习,这次以实战作为主要部分,此次的实战内容为Stream流,Lambda,以及日期的相关处理。
小小最近小blog更新不利,处于一种不太理想的状态,不过还好,最近情绪处于一种稳定状态。小小似乎,只需要处于这种稳定状态,就可以实现blog的稳定更新了。
Lambda和Stream
这里小小将会介绍几个简单的例子,通过例子学习Lambda表达式的相关简述。
实现多线程
这里以前实现多线程的时候,是实现内部类,Runnab接口实现多线程,代码如下
new Thread(new Runnable(){
@Override
public void run(){
System.out.println("Before Java8")
}
}).start()
上方接口实现了一个内部类,并实现了相关的接口的方法。
现在由于有lambda表达式。使用这里使用java8的新的方法实现、
new Thread(() -> System.out.println("Java8")).start()
上方代码,通过lambda表达式,实现。仅仅通过一行,就完成了。
输出内容为:
too much code, for too little to do
Lambda expression rocks !!
如果要编写两个参数,需要书写如下的内容
(int even, int odd) -> even + odd
这个时候返回的内容为两数的和,
使用表达式传入相关的参数
使用表达式写出更好的时间监听代码。在Java8之前如下
JButton show = new JButton("Show");
show.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Event handling without lambda expression is boring");
}
});
在Java8以后,可以直接使用如下的方式
// Java 8方式:
show.addActionListener((e) -> {
System.out.println("Light, Camera, Action !! Lambda expressions Rocks");
});
事实上这个和第一个没有多大的区别,捂脸
使用Lambda表达式对列表进行迭代
集合最常用的方法是进行相关的迭代,在Java8之前,迭代如下
// Java 8之前:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
for (String feature : features) {
System.out.println(feature);
}
在Java8以后,可以直接使用如下的方式进行迭代
// Java 8之后:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features.forEach(n -> System.out.println(n));
// 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,
// 看起来像C++的作用域解析运算符
features.forEach(System.out::println);
这个时候输出如下
Lambdas
Default Method
Stream API
Date and Time API
添加了一个新的过滤接口包
除了语言上语法的支持,这次新增加了一个包,为function包,这里实现一个简单的接口过滤。
public static void main(String[] args) {
List languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
System.out.println("Languages which starts with J :");
filter(languages, (str)->((String)str).startsWith("J"));
System.out.println("Languages which ends with a ");
filter(languages, (str)->((String)str).endsWith("a"));
System.out.println("Print all languages :");
filter(languages, (str)->true);
System.out.println("Print no language : ");
filter(languages, (str)->false);
System.out.println("Print language whose length greater than 4:");
filter(languages, (str)->((String)str).length() > 4);
}
public static void filter(List names, Predicate condition) {
for(String name: names) {
if(condition.test(name)) {
System.out.println(name + " ");
}
}
}
输出内容如下
Languages which starts with J :
Java
Languages which ends with a
Java
Scala
Print all languages :
Java
Scala
C++
Haskell
Lisp
Print no language :
Print language whose length greater than 4:
Scala
Haskell
// 更好的办法
public static void filter(List names, Predicate condition) {
names.stream().filter((name) -> (condition.test(name))).forEach((name) -> {
System.out.println(name + " ");
});
}
添加相关的方法
这次添加相关的方法为and,or等方法
// 甚至可以用and()、or()逻辑函数来合并Predicate,
// 例如要找到所有以J开始,长度为四个字母的名字,你可以合并两个Predicate并传入
Predicate startsWithJ = (n) -> n.startsWith("J");
Predicate fourLetterLong = (n) -> n.length() == 4;
names.stream()
.filter(startsWithJ.and(fourLetterLong))
.forEach((n) -> System.out.print("nName, which starts with 'J' and four letter long is : " + n));
Java中 过滤Map和List
这里使用forEach过滤map和list相关的内容,其代码如下
// 不使用lambda表达式为每个订单加上12%的税
List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
for (Integer cost : costBeforeTax) {
double price = cost + .12*cost;
System.out.println(price);
}
// 使用lambda表达式
List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
costBeforeTax.stream().map((cost) -> cost + .12*cost).forEach(System.out::println);
这个时候,输出的结果为
112.0
224.0
336.0
448.0
560.0
112.0
224.0
336.0
448.0
560.0
通过过滤创建一个String列表
这里通过过滤的方式创建一个String列表相关的内容
// 创建一个字符串列表,前半部分为进行过滤,后半部分为创建一个字符串列表
List filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList());
System.out.printf("Original List : %s, filtered list : %s %n", strList, filtered);
这个时候,输出结果如下
Original List : [abc, , bcd, , defg, jk], filtered list : [abc, bcd, defg]
对列表的每个元素应用相关的函数
// 将字符串换成大写并用逗号链接起来
List 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
复制不同的值,创建一个子列表
这个利用流,来对集合进行去重
// 用所有不同的数字创建一个正方形列表
List numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4);
List distinct = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
System.out.printf("Original List : %s, Square Without duplicates : %s %n", numbers, distinct);
通过添加相关的方法,实现对集合的去重。
计算集合的最大值,最小值,以及平均值
//获取数字的个数、最小值、最大值、总和以及平均值
List primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("Highest prime number in List : " + stats.getMax());
System.out.println("Lowest prime number in List : " + stats.getMin());
System.out.println("Sum of all prime numbers : " + stats.getSum());
System.out.println("Average of all prime numbers : " + stats.getAverage());
这里输出的结果如下
Highest prime number in List : 29
Lowest prime number in List : 2
Sum of all prime numbers : 129
Average of all prime numbers : 12.9
Java日期
这部分讲解Java基础内容日期部分。
获取当前的日期
import java.util.Date;
public class DateDemo {
public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();
// 使用 toString() 函数显示日期时间
System.out.println(date.toString());
}
}
运行结果如下
Mon May 04 09:51:52 CDT 2013
使用SimpleDateFormat格式化日期
这里使用SimpleDateFormat来格式化相关的日期
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
System.out.println("当前时间为: " + ft.format(dNow));
}
}
实际输出的结果如下
当前时间为: 2018-09-06 10:16:34
解析字符串为时间
这里解析字符串为时间
import java.util.*;
import java.text.*;
public class DateDemo {
public static void main(String args[]) {
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd");
String input = args.length == 0 ? "1818-11-11" : args[0];
System.out.print(input + " Parses as ");
Date t;
try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Unparseable using " + ft);
}
}
}
输出结果如下
$ java DateDemo
1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818
$ java DateDemo 2007-12-01
2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007
Sleep
这里Java进行休眠状态,进入阻塞状态
import java.util.*;
public class SleepDemo {
public static void main(String args[]) {
try {
System.out.println(new Date( ) + "n");
Thread.sleep(1000*3); // 休眠3秒
System.out.println(new Date( ) + "n");
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
输出结果如下
Thu Sep 17 10:20:30 CST 2015
Thu Sep 17 10:20:33 CST 2015
测量时间
这里表明如何测量时间
import java.util.*;
public class DiffDemo {
public static void main(String args[]) {
try {
long start = System.currentTimeMillis( );
System.out.println(new Date( ) + "n");
Thread.sleep(5*60*10);
System.out.println(new Date( ) + "n");
long end = System.currentTimeMillis( );
long diff = end - start;
System.out.println("Difference is : " + diff);
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
}
输出结果如下
Fri Jan 08 09:48:47 CST 2016
Fri Jan 08 09:48:50 CST 2016
Difference is : 3019
小明菜市场
推荐阅读
●理论 | 优雅的构建一个健壮的API接口
●实战 | webmagic爬取实战之爬取保险经纪人信息
●实战 | WebMagic 爬取某保险经纪人网站经纪人列表之网站列表爬取
●实战 | WebMagic 实现分布式爬虫
●实记 | MongoDB 多表连接查询
领取专属 10元无门槛券
私享最新 技术干货