Java 流之Stream,Lambda以及日期

小小最近开始学习,这次以实战作为主要部分,此次的实战内容为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 多表连接查询

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200814A00Y2O00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券