jdk1.8新特性

类的两个要素:
属性三要素:(修饰符);类型,名字,值
方法五要素:修饰符,返回值,方法名,形参,方法体
构造方法:是一个特殊的方法
抽象方法:是一个特殊的方法
抽象类:是一个特殊的抽象类
接口:是一个特殊的抽象类
接口中的方法全部是抽象的
接口中的属性全部是public static final 修饰
jdk1.8新特性
在接口中的方法可以有方法体

1.特殊接口

为什么接口中的方法要有方法体:
接口就是为了定标准,这个标准要求所有的实现类,实现抽象方法
其实有些方法,所有的实现类代码都是一样的;干脆就把这些代码挪到接口中

特殊接口必须被default修饰

示例:
IAnimal类

 import java.util.function.Supplier; 
 /** 
 * 接口: 
 *  	为什么接口中的方法要有方法体: 
 * 		接口就是为了定标准,这个标准要求所有的实现类,实现抽象方法; 
 *  		其实有些方法,所有的实现类代码都是一样的;干脆就把这些代码挪到接口中; 
  */
  public interface IAnimal{	
  // 属性 	
  int HEAD_NUM = 1 ; 	
  /* 下面的写法等同于上面的	
  * 被static修饰的,名字都是大写,	 
  * 但是驼峰标识:单词之前使用_隔开	 
  */	
  //public static int HEADNUM = 1 ; 		
  /* 抽象的方法 */	
  /**	 
  * 抽象的方法,跑	
  */	
   void run();	
   /* 丢人的写法 */
   //public abstract void run1();	
   	
   /* ====新特性开始 ==== */	
   /**	 * 有方法体的方法(普通的方法)	
    * 吃	 
    * 要求:	
    * 		必须被default修饰	 
    * 		此default和修饰符里面的default不一样	     	
    * 		它是被public修饰	
    */	
default void eat()	{	  
   System.out.println("==IAnimal==eat");	
  }		
 /**	
 * 睡的方法	
 */	
default String sleep()	{		
   System.out.println("==IAnimal==sleep");		
   return "===" ; 
}		
 /* 静态的方法 */
static void staticMethod(){		
  System.out.println("==IAnimal==staticMethod");	
 }		
/**	
 * 参数是一个接口;	
 * Supplier<IAnimal> supplier(供应商)	
 *  @return	
 */	
 static IAnimal createObj(Supplier<IAnimal> supplier)	{		
     /* 让供应商去提供供货 */		
    return supplier.get() ; 	
    }	
    /* ====新特性结束 ==== */
}

Person类

 /** 
 * 人,是一个实现类 
 * 		如果一个类实现一个接口,就要把接口中所有的抽象方法实现一遍
 * 		也可以实现接口中有方法体的方法(不能是静态方法) 
 */
public class Person implements IAnimal{	
	@Override	
	public void run()	{		
		System.out.println("==Person==run");	
	} 	
	@Override	
	public void eat()	{		
		/* 调用父类的方法 */		
		//IAnimal.super.eat();		
		System.out.println("==Person==eat");	
	}
}

Dog类

/** 
* 狗
*/
public class Dog implements IAnimal{ 	
	@Override	
	public void run()	{		
		System.out.println("==Dog==run");	
	}
}

测试类

/** 
* 所有的程序的入口函数
*/
public class ClientMain{	
public static void main(String[] args)	{		
System.out.println("==南宋中兴四将==");		
/* 测试第一个		 
 *父类引用指向子类对象		
 */		
 IAnimal person = new Person();		
 /* 调用属性 */		
 int headNum = person.HEAD_NUM ; 		
 System.out.println("==person.HEAD_NUM==" + headNum);		
 /* 接口名.属性 */		
 System.out.println("==IAnimal.HEAD_NUM==" + IAnimal.HEAD_NUM);		
 /* 调用方法 */		
 /* 调用抽象方法 */		
 person.run();		
 /*=====新知识======*/		
 /* 调用的是接口中有方法体的方法 */		
 person.eat(); 		
 person.sleep();		
 /* 调用的是接口中的静态方法 */		
 IAnimal.staticMethod();				
 /*==new对象==*///		
 IAnimal dog = new Dog();		
 /* Dog::new	调用的是Dog中的new方法		
  * ::调用方法的简写,左边是类名或者接口名,右边是方法名		 
  *  返回值必须是functional Interface;(等讲到lambda表达式的时候再说)		 
  *  必须有返回值		
  */		
  IAnimal dog = IAnimal.createObj(Dog::new);		
  System.out.println("==createObj==" + dog);		
  IAnimal dog1 = Dog::new;		
  /* 调用方法
   * 用::调用方法,返回值必须是functional Interface
   * 必须有返回值类型
   */		
  //String res = dog::sleep;	
  }
 }

2.Lambda

Lambda示例代码

import java.util.Date; 
/** 
 * lambda的测试类 
 *  		最终要实现的效果和匿名类很像
 */
public class LambdaMain{	
	public static void main(String[] args)	{		
		System.out.println("====");		
		//lambdaAll();		 		
		System.out.println("==main开始==");		
		/* 创建线程并启动 		
		 * 接口中唯一的抽象方法		
		 *  public abstract void run();		 
		 *  最全的写法:它是唯一的抽象方法的简写		
		 *  	(方法的形参) -> {方法体,如果有返回值,一定要写返回值}		
		 *  最全的省略:		
		 *  		如果目标方法只有一个参数,可以省略小括号		
		 *  		小括号里面的形参:类型可以省略		 
		 *  		如果方法体只有一行,大括号可以省略		 
		 * */		
		 Thread t = new Thread( () -> System.out.println(Thread.currentThread() + "==计数=="+ "==" + new Date().toLocaleString()) );		
	 t.start();		
		 System.out.println("==main结束==");	
 	} 	

 /**	
  * 最全的写法(lambda)	
  * /
private static void lambdaAll()	{		
 	System.out.println("==main开始==");		
	/* 创建线程并启动 		 
	* 接口中唯一的抽象方法		
	*  public abstract void run();		 
	*  最全的写法:它是唯一的抽象方法的简写		
	*  	(方法的形参) -> {方法体,如果有返回值,一定要写返回值}		
	*  最全的省略:		
	*  		如果目标方法只有一个参数,可以省略小括号		
	*  		小括号里面的形参:类型可以省略		
	*  		如果方法体只有一行,大括号可以省略		
	**/		
	 Thread t = new Thread( () -> 	{			
		for (int i = 0; i < 10; i++){				
			System.out.println(Thread.currentThread() + "==计数=="+ i +"==" + new Date().toLocaleString());				
			try{					
				Thread.sleep(500);				
		   	} catch (InterruptedException e){					
				e.printStackTrace();				
			}			
		     }		
		} );		
			t.start();		
			System.out.println("==main结束==");	
		}
}

Lambda表达式的示例代码

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

/**
 * lambda的测试类 最终要实现的效果和匿名类很像
 * 	如果看到一个方法的参数类型后面跟了一个...
 * 		在方法定义的时候,把这三个点的参数,当成数组使用(String ... str)和(String[] str)效果一样
 * 		在方法使用的时候,这三个点要传入实参,实参的个数随便填写
 * 		...必须是方法形参的最后一个
 * ~示例:方法调用时(String[] str)
 * String[] str = {"1","2","3"} ;
 * 	目标方法(str) 
 * ~方法调用时String ... str
 * 	目标方法("1","2","3","3","3","3","3","3")
 * @author TeaBig
 */
public class LambdaTest
{
	public static void main(String[] args)
	{
		System.out.println("====");
		/* 调用方法 */
		String[] str = {"1","a","b","c","d"};
		//method1Arr(str,"2");
		/* 调用方法 */
		//method2Point(str);
		method2Point(1,"1","a","b","c","d","e");
		/* 集合抽取lambda */
		lambdaList();
	}

	/**
	 * lambda表达式,测试类
	 */
	private static void lambdaList()
	{
		/* 准备一个List */
		List<String> list = Arrays.asList("1","a","b","c","d");
		/* 如何循环
		 * void accept(T t);
		 * (类型忽略,直接写名字,形参名,名字随便写)
		 *  */
	//		list.forEach( (t) -> 
	//		{
	//			System.out.println("==lambda循环==" + t);
	//		} );
		/* 超级简单的写法 */
		list.forEach( t -> System.out.println("==lambda循环==" + t));
		/* 匿名类
		 * 泛型是和容器的泛型一致
		 *  */
		list.forEach(new Consumer<String>()
		{
			@Override
			public void accept(String t)
			{
				System.out.println("==Consumer循环==" + t) ; 
			}
		});
	}
		
	/**
	 * 方法的形参是数组
	 * @param str
	 */
	public static void method1Arr(String[] str)
	{
		/* 查看数组里面的内容 */
		for (int i = 0; i < str.length; i++)
		{
			String temp = str[i];
			System.out.println(i + "==method1Arr==" + temp);
		}
	}
		
	/**
	 * 方法的形参是三个点
	 * @param str
	 */
	public static void method2Point(int j , String... str)
	{
		/* 查看数组里面的内容 */
		for (int i = 0; i < str.length; i++)
		{
			String temp = str[i];
			System.out.println(i + "==method2Point==" + temp);
		}
	}
}

3.数据流编程

1.transformaction算子(方法的返回值还是Stream)
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;

import org.junit.Test;

/**
 * 数据流编程
 * @author TeaBig
 */
public class DataStream
{
	/**
	 * 测试一个方法(框架)
	 */
	@Test
	public void base()
	{
		/* 准备一个容器 */
		List<Integer> intList = Arrays.asList(100,2,38,12,50,87);
		/* 准备一个Stream */
		Stream<Integer> souStream = null;
		try
		{
			souStream = intList.stream(); 
			/* 并行:多线程 */
			//souStream = intList.parallelStream();
			System.out.println("=isParallel==>" + souStream.isParallel());
			/* 循环数据
			 * java.util.function.Consumer
			 * void accept(T t);
			 * 
			 * forEach:action算子
			 *  */
			souStream.forEach( t -> System.out.println("==Stream循环==" + t));
		} catch (Exception e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally
		{
			if(souStream != null)
			{
				souStream.close();
				souStream = null ; 
			}
		}
	}
	
	/**
	 * 过滤
	 * 按照指定的条件,对数据流里面的数据进行过滤
	 */
	@Test
	public void transformaction_Filter()
	{
		/* 准备一个容器 */
		List<Integer> intList = Arrays.asList(100,2,38,12,50,87);
		/* 准备一个Stream */
		Stream<Integer> souStream = intList.stream() ; 
		/* 过滤 
		 * java.util.function.Predicate<T>
		 * boolean test(T t);
		 * 
		 * 只有一行代码,return可以省略
		 * */
		Stream<Integer> filterStream = souStream.filter( (t) -> t > 50);
		/* 循环数据
		 * java.util.function.Consumer
		 * void accept(T t);
		 * 
		 * forEach:action算子
		 *  */
		filterStream.forEach( t -> System.out.println("==Stream循环==" + t));
		/* 关闭 */
		souStream.close();
	}
	
	/**
	 * 过滤
	 */
	@Test
	public void transformaction_Filter_Base()
	{
		/* 准备一个容器 */
		List<Integer> intList = Arrays.asList(100,2,38,12,50,87);
		/* 准备一个Stream */
		Stream<Integer> souStream = intList.stream() ;
		/* 过滤算子 */
		Stream<Integer> filterStream = souStream.filter( new Predicate<Integer>()
		{
			@Override
			public boolean test(Integer t)
			{
				System.out.println("=filter==test=" + t);
				return t > 50;
			}
		} );
		filterStream.forEach( new Consumer<Integer>()
		{
			@Override
			public void accept(Integer t)
			{
				System.out.println("==循环==" + t);
			}
		} );
		/* 关闭 */
		souStream.close();
	}
	
	/**
	 * map算子
	 * 按照指定的条件,对数据流里面的数据进行处理(加工)
	 */
	@Test
	public void transformaction_Map()
	{
		/* 准备一个容器 */
		List<Integer> intList = Arrays.asList(100,2,38,12,50,87);
		/* 准备一个Stream */
		Stream<Integer> souStream = null;
		try
		{
			souStream = intList.stream(); 
			
			/* map算子;要把输入参数,经过一个方法变成另外一个参数;(处理参数)
			 * java.util.function.Function<T, R>
			 * R apply(T t);
			 * 
			 * 需求:要把这里面的整数,都加一个字符串
			 *  */
			Stream<String> mapStream = souStream.map( (t) -> t + "==我变化了");
			
			/* 循环数据
			 * java.util.function.Consumer
			 * void accept(T t);
			 * 
			 * forEach:action算子
			 *  */
			mapStream.forEach( t -> System.out.println("==Stream循环==" + t));
		} catch (Exception e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally
		{
			if(souStream != null)
			{
				souStream.close();
				souStream = null ; 
			}
		}
	}
	
	/**
	 * FlatMap算子 
	 * 它会对数据流里面的数据大小有要求
	 */
	@Test
	public void transformaction_FlatMap()
	{
		/* 准备一个容器 */
		List<String> strList = Arrays.asList("ab","cd","ef","test-hello-hadoop");
		/* 准备一个Stream */
		Stream<String> souStream = null;
		try
		{
			souStream = strList.stream(); 
			
			/* map算子;要把输入参数,经过一个方法变成另外一个参数;(处理参数)
			 * java.util.function.Function<T, R>
			 * R apply(T t);
			 * 
			 * 需求:要把这里面的整数,都加一个字符串
			 * 
			 * map的参数:    Function<? super T, ? extends R> mapper;R木有要求
			 * flatMap的参数:Function<? super T, ? extends Stream<? extends R>> mapper;R要求必须是Stream;
			 *  */
			Stream<String> flatMapStream = souStream.flatMap( t -> 
			{
				/(* 把字符串根据-拆分开 */
				String[] splitList = t.split("-");
				/* 返回值还是Stream这里面放的是字符串 */
				List<String> tempList = Arrays.asList(splitList);
				return tempList.stream() ; 
			});
			
			/* 循环数据
			 * java.util.function.Consumer
			 * void accept(T t);
			 * 
			 * forEach:action算子
			 *  */
			flatMapStream.forEach( t -> System.out.println("==Stream循环==" + t));
		} catch (Exception e)
		{
			e.printStackTrace();
		} finally
		{
			if(souStream != null)
			{
				souStream.close();
				souStream = null ; 
			}
		}
	}
	
	/**
	 * FlatMap算子
	 * 它会对数据流里面的数据大小有要求
	 */
	@Test
	public void transformaction_other()
	{
		/* 准备一个容器 */
		List<Integer> intList = Arrays.asList(100,2,50,50,50,87);
		/* 准备一个Stream */
		Stream<Integer> souStream = null;
		try
		{
			souStream = intList.stream(); 
			/*
			 * distinct:去重
			 * */
			//Stream<Integer> stream = souStream.distinct();
			/* 取前几条记录 */
			//Stream<Integer> stream = souStream.limit(2);
			/* 跳过前n条数据 */
			//Stream<Integer> stream = souStream.skip(2);
			/* 排序:默认升序 */
			//Stream<Integer> stream = souStream.sorted();
			/* java.util.Comparator<T>:
			 * int compare(T o1, T o2);
			 *  */
			//Stream<Integer> stream = souStream.sorted( (t1,t2) -> -(t1 - t2) );()
			Stream<Integer> stream = souStream.unordered();
			
			/* 循环数据
			 * java.util.function.Consumer
			 * void accept(T t);
			 * 
			 * forEach:action算子
			 *  */
			stream.forEach( t -> System.out.println("==Stream循环==" + t));
		} catch (Exception e)
		{
			e.printStackTrace();
		} finally
		{
			if(souStream != null)
			{
				souStream.close();
				souStream = null ; 
			}
		}
	}
}
2.action算子(方法的返回值不是Stream)
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

import org.junit.Test;

/**
 * 全是对一些action算子的测试
 * @author TeaBig
 *
 */
public class DataStreamAction
{
	/**
	 * 数据流测试的基本代码
	 */
	@Test
	public void base()
	{
		/* 准备一个List */
		List<Integer> intList = Arrays.asList(100,2,38,12,50,87);
		/* 准备一个Stream */
		Stream<Integer> stream = intList.stream() ; 
		try
		{
			/* 循环 */
			stream.forEach( t -> System.out.println("==循环==" + t));
		}catch(Exception e)
		{
			if(stream != null)
			{
				/* 关闭 */
				stream.close();
				stream = null ; 
			}
		}
	}
	
	/**
	 * 数据流测试的基本代码
	 * 数据流,只能碰到一个action算子
	 *数据流:
	 *一根管子,一个数据会把所有的管子走完以后,再走第二个数据;
	 *而不是所有的数据走完第一个管子以后,再一块走第二个管子
	 */
	@Test
	public void other()
	{
		/* 准备一个List */
		List<Integer> intList = Arrays.asList(1,2,3,4,5);
		/* 准备一个Stream */
		Stream<Integer> stream = intList.stream() ; 
		try
		{
			/* 把流里面的数据变成数组 */
//			Object[] arrays = stream.toArray();
//			System.out.println("==toString==>" + Arrays.toString(arrays));
			/* 数据的数量 */
//			long count = stream.count() ; 
//			System.out.println("==count==>" + count);
			/* 查询第一个元素 */
//			Optional<Integer> findFirst = stream.findFirst();
//			System.out.println("==findFirst==>" + findFirst.get());
			/* 获取到迭代器 */
//			for (Iterator<Integer> iterator = stream.iterator(); iterator.hasNext();)
//			{
//				Integer intValue = (Integer) iterator.next();
//				System.out.println("==循环==" + intValue);
//			}
			
			/* 获取最大值
			 * 先排序:(不管是升序还是降序,他始终认的是第一个)
			 *  */
//			Optional<Integer> maxOption = stream.max( (t1,t2) -> t1 - t2);
//			System.out.println("==max=>" + maxOption.get());
			/* 获取最小值 */
//			Optional<Integer> minOption = stream.min( (t1,t2) -> t2 - t1);
//			System.out.println("==min=>" + minOption.get());
			
			/* 缩减
			 * 参数是:java.util.function.BinaryOperator<T>;得找有抽象方法的接口:
			 * java.util.function.BiFunction<T, U, R> 
			 * 抽象方法是:R apply(T t, U u);
			 * 泛型T,U是输入参数,R是输出参数
			 *  */
			Optional<Integer> reduce = stream.reduce( (t1,t2) -> t1 + t2);
			System.out.println("==reduce=>" + reduce.get());
		}catch(Exception e)
		{
			if(stream != null)
			{
				/* 关闭 */
				stream.close();
				stream = null ; 
			}
		}
	}
}

数据流:
一根管子,一个数据会把所有的管子走完以后,再走第二个数据;
而不是所有的数据走完第一个管子以后,再一块走第二个管子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值