小小最近开始学习,这次以实战作为主要部分,此次的实战内容为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<String> 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<String> 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<String> startsWithJ = (n) -> n.startsWith("J");
Predicate<String> 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<String> 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<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 

复制不同的值,创建一个子列表

这个利用流,来对集合进行去重

// 用所有不同的数字创建一个正方形列表
List<Integer> numbers = Arrays.asList(9, 10, 3, 4, 7, 3, 4);
List<Integer> 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<Integer> 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