zoukankan      html  css  js  c++  java
  • Java8的重要新特性

    一、Lambda表达式

    java8中Lambda表达式的书写方式: 
    (参数) -> 表达式 
    (参数) -> 单行语句 
    (参数) -> { 语句 } 

    1.Lambda遍历List和Map

    package com.yanwu.www.demo;
    
    /**
     * @author Harvey
     */
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    
    public class Demo1 {
    	public static void main(String[] args) {
    		List list=new ArrayList<>();
    		Map<String,Object> map=new HashMap();
    		list.add("aa");
    		list.add("bb");
    		list.add("cc");
    		map.put("key1", "value1");
    		map.put("key2", "value2");
    		map.put("key3", "value3");
    		//原始遍历List方法
    		for(String str:list){
    			System.out.println(str);
    		}
    		System.out.println("======Lambda操作list的for each循环==========");
    		list.forEach(obj->{
    			obj=obj.toUpperCase();
    			System.out.println(obj);
    			});
    		System.out.println("********对Map进行操作*********");
    		//原始遍历Map方法
    		for(Map.Entry<String, Object> entry:map.entrySet()){
    			System.out.println(entry.getKey()+":"+entry.getValue());
    		}
    		System.out.println("======Lambda操作map的循环==========");	
    		map.forEach((K,V)->{
    			System.out.println(K+":"+V);
    		});
    	
    	}
    	
    	
    	
    }
    
    View Code

    二、接口的默认方法

    Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法。

    package com.yanwu.www.demo;
    
    /** 
    * @ClassName: Demo2 
    * @Description: TODO(这里用一句话描述这个类的作用) 
    * @author Harvey
    * @date 2017年7月31日 下午10:01:57 
    *  
    */
    interface Demo{
    	void test1();
    	//default关键字,接口的默认方法
    	default void test2(){
    		System.out.println("this is test2()");
    	}
    }
    
    public class Demo2 {
    	public static void main(String[] args) {
    		Demo d=new Demo(){
    			@Override
    			public void test1() {
    				// TODO Auto-generated method stub
    				System.out.println("this is test1()");
    			}
    			
    		};
    		d.test1();//实例化的时候已经实现
    		d.test2();//直接可以调用
    	}
    }
    
    
    View Code

    三、方法和构造函数的引用

    Java 8 允许你使用 :: 关键字来传递方法或者构造函数引用。一共定义了四种形式:

    • 引用静态方法:类名称 :: static 方法名称;
    • 引用某个对象的方法:实例化对象 :: 普通方法
    • 引用特定类型的方法:特定类 :: 普通方法
    • 引用构造方法: 类名称::new

    引用静态方法:类名称 :: static 方法名称

    package com.yanwu.www.demo;
    
    import java.util.function.Consumer;
    import java.util.function.Predicate;
    import java.util.function.Supplier;
    
    /** 
    * @ClassName: Person 
    * @Description: TODO(这里用一句话描述这个类的作用) 
    * @author Harvey
    * @date 2017年7月31日 下午10:17:26 
    *  
    */
    @FunctionalInterface //只能定义一个方法
    interface Demo3<P,R>{
    	R test3(P p);
    }
    
    public class Person {
    	private int age;
    	private String name;
    	private String sex;
    	public Person(){}
    	public void test1(){
    		System.out.println("this is normal method test1()");
    	}
    	public static void test2(){
    		System.out.println("this is static method test2()");
    	}
    	public static void main(String[] args) {
    		Person p=new Person();
    		p.test1();
    		Person.test2();
    		Demo3<Integer,String> d0=String::valueOf;//对静态方法的引用
    		System.out.println(d0.test3(1));
    		
    	}	
    	
    }
    
    View Code

    (其他例子暂略)

    四、函数式接口包以及提供的四个核心函数式接口

    包:java.util.function

    四个核心接口:

      1.功能性接口: public interface Function<T, R> {R apply(T t);} //接收一个参数,返回一个处理结果

      2.消费型接口:public interface Consumer<T> {void accept(T t);} //负责接收数据,并且不返回处理结果

      3.供给型接口:public interface Supplier<T> { T get();} //不接收参数,可以返回结果

      4.断言性接口 : public interface Predicate<T> {boolean test(T t);} //进行判断操作

    package com.www.yanwu.Annotation;
    
    import java.util.function.Consumer;
    import java.util.function.Function;
    import java.util.function.Predicate;
    import java.util.function.Supplier;
    
    /** 
    * @ClassName: Demo4 
    * @Description: TODO(这里用一句话描述这个类的作用) 
    * @author Harvey
    * @date 2017年7月31日 下午11:25:38 
    *  
    */
    public class Demo4 {
    	public static void main(String[] args) {
    		String str="##hello";
    		//测试功能性接口,有参数,有返回值
    		Function<String,Boolean> fun=str::startsWith;
    		System.out.println(fun.apply("#"));
    		//测试消费型接口,有参数,无返回值
    		Consumer c=System.out::println;
    		c.accept("hello world");
    		//测试供给型接口,没有参数,有返回值的
    		Supplier s=str::toUpperCase;
    		System.out.println(s.get());
    		//测试断言型接口,有参数,返回布尔型
    		Predicate p=str::equalsIgnoreCase;
    		System.out.println(p.test("##hello"));
    		
    	}
    	
    }
    
    
    View Code
  • 相关阅读:
    ClipboardJS实现将页面内容复制到剪贴板
    全文索引FULLTEXT 的使用
    [1].Array.diff
    Leetcode——Queue队列
    Matplotlib——scatter散点图
    Matplotlib的一些小细节——tick能见度
    Matplotlib的一些小细节——Annotation标注
    Matplotlib的一些小细节——Legend图例
    Matplotlib基本知识(figure & axes
    锁升级简记
  • 原文地址:https://www.cnblogs.com/harvey2017/p/7266336.html
Copyright © 2011-2022 走看看