1.Properties类
Properties
package com.qfedu.test1Properties;import java.util.Properties;public class Demo2test {public static void main(String[] args) {Properties p = new Properties();//类似map集合 存数据p.put("01", "朱1");p.put("02", "朱2");//通过键取值System.out.println(p.get("01"));System.out.println(p.get("02"));}}
Properties可以从流中加载,欸有去读取这个文件,使用Properties讲数据加载出来,以后开发中后缀是 .properties的文件
Person1
package com.qfedu.test1Properties;public class Person1 {public void test1() {System.out.println("test1");}}
Person2
package com.qfedu.test1Properties;public class Person2 {public void test2(){System.out.println("test2");}}
Domo1
package com.qfedu.test1Properties;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.util.Properties;public class Demo1 {public static void main(String[] args) throws Exception {File file = new File("D:\\eclipse-workspace\\day414\\src\\haha.txt");Properties properties = new Properties();//从输入字节流读取属性列表(键和元素对)键值对properties.load(new FileInputStream(file));String className = (String) properties.get("Class");String methodName = (String) properties.get("Method");Class<?> aClass1 = Class.forName(className);Method method = aClass1.getMethod(methodName, null);Constructor<?> constructor = aClass1.getConstructor(null);Object object = aClass1.newInstance();method.invoke(object, null);}}
一、lambda表达式【难】
有一个接口,方法参数是一个接口(且下面只有一个方法),可以使用lambda表达式
语法格式
() -> sout();
1.入门案例
package com.qfedu.test2lambda;//lambda 入门案例public class Demo1 {public static void main(String[] args) {//新建一个线程 runnable是一个接口 作为Thread类的一个参数new Thread(new Runnable() {@Overridepublic void run() {System.out.println("匿名内部类的线程一种写法");}}).start();//lambda表达式的写法Runnable run = ()->System.out.println("这个是另外一种写法");new Thread(run).start();;}}
总结
方法的参数是一个接口,,接口只有一个需要重写的方法。这个接口对象可以不用new了,直接用lambda表达式。
语法格式:
接口 接口名字 = (参数)->重写的内容;接口 接口名字 = (参数)->{重写的内容;};():接口下面的方法 可以是有参数的。重写的方法:代码体,输出语句等。
2.1无参无返回值
package com.qfedu.test2lambda;interface A {public void eat();//无参无返回值}public class Demo2 {public static void main(String[] args) {test(() -> System.out.println("吃饭"));}public static void test(A a) {a.eat();}}
2.2有参无返回值
package com.qfedu.test2lambda;//有参无返回值的写法interface B{public void sleep(String name);//有参无返回值}public class Demo3 {public static void main(String[] args) {// B b = new B() {//// @Override// public void sleep(String name) {// System.out.println(name);//// }// };//B b = (String name)->System.out.println(name);test(b, "睡觉");}public static void test(B b,String name) {b.sleep(name);}}
2.3无参有返回值
注意 有返回值的 -> 后面的表达式需要{}括起来
package com.qfedu.test2lambda;//无参有返回值interface C{public int add();}public class Demo4 {public static void main(String[] args) {// C c = new C() {//// @Override// public int add() {// // TODO Auto-generated method stub// return 4;// }// };C c = () -> {return 4;};test(c);}public static void test(C c) {int a = c.add();System.out.println(a);}}
2.4有参数有返回值
package com.qfedu.test2lambda;//有参数有返回值interface D{public int add(int a, int b);}public class Demo5 {public static void main(String[] args) {// D d = new D() {//// @Override// public int add(int a, int b) {// int sum1 = a + b;// return sum1;// }// };D d = (int a, int b) ->{int sum1 = a+b;return sum1;};test(d, 3, 4);test((int a, int b) ->{int sum1 = a+b;return sum1;},3,5);}public static void test(D d,int a, int b) {int sum = a + b;System.out.println(sum);}}
注意事项
使用lambda表达式,接口下面不允许有多个方法,这是个局限性
真是开发,如果接口只有一个参数,可以不用new,直接使用lambda
2.5 lambda遍历
写法 集合.forEach(System.out::println)
package com.qfedu.test2lambda;import java.util.ArrayList;import java.util.List;//lambda表达式遍历public class Demo6 {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("啊");list.add("吧");list.add("从");//增强foreach循环遍历// for (String s1 : list) {// System.out.println(s1);// }//lambda遍历list.forEach(System.out::println);}}
二、Stream流【难点】
需求,list集合中过滤出姓张的存到新集合中,在从姓张的集合中过滤出三个字的
package com.qfedu.test3Stream;import java.util.ArrayList;import java.util.List;import java.util.jar.Attributes.Name;//需求,list集合中过滤出姓张的存到新集合中,在从姓张的集合中过滤出三个字的public class Demo1 {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("张一");list.add("张二三");list.add("朱四五");list.add("张六七");list.add("张八九");//用来存姓张的集合List<String> list1 = new ArrayList<String>();for (String s1 : list) {//取出首字是张的 startWithif (s1.startsWith("张")) {list1.add(s1);}}System.out.println(list1);//用来存姓张的且是三个字的集合List<String> list2 = new ArrayList<String>();for (String s2 : list1) {//字符串长度为三的if (s2.length() == 3) {list2.add(s2);}}System.out.println(list2);}}
使用Stream流进行操作,获取流对象,过滤操作,输出打印
package com.qfedu.test3Stream;import java.util.ArrayList;import java.util.List;//需求,list集合中过滤出姓张的存到新集合中,在从姓张的集合中过滤出三个字的//用Stream流进行操作需求 stream流中的filter过滤方法public class Demo2 {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("张一");list.add("张二三");list.add("朱四五");list.add("张六七");list.add("张八九");//链式操作list.stream().filter((String name)->name.startsWith("张")).filter((String name)->name.length() == 3).forEach((String name)->System.out.println("过滤出来的姓名为:" + name));// .forEach(System.out::println);;}}
分析代码
list.stream() 将集合数据存到stream流中.filter((String name)->name.startsWith("张")) 过滤姓张的值.filter((String name)->name.length() == 3) 过滤姓张长度为3的.forEach((String name)->System.out.println("过滤出来的姓名为:" + name)); 过滤完之后进行遍历打印
2.1获取流
只有集合和数组才能变成流对象,单个数据元素没法变成流对象
根据集合获取流,因为集合中有数据
Collection获取流:
default Stream streadm() 不是抽象方法
返回一个顺序Stream与此集合作为其来源。就是数据源[1,2,3]把这个集合变成流对象了
1.根据list获取流对象
List<String> list = new ArrayList<String>();list.add("张一");list.add("张二三");list.add("朱四五");list.add("张六七");list.add("张八九");//获取流对象Stream<String> stream = list.stream();System.out.println(stream);
2.根据set集合获取流对象
Set<String> set = new HashSet<String>();set.add("艾斯");set.add("萨博");set.add("路飞");Stream<String> stream2 = set.stream();System.out.println(stream2);
3.根据map集合获取流对象
Map<Integer, String> map = new HashMap<Integer, String>();map.put(1, "王路飞");map.put(2, "刘索隆");map.put(3, "马山治");//根据map集合中的键获取流对象Set<Integer> set3 = map.keySet();Stream<Integer> stream3 = set3.stream();//根据map集合中的值获取流对象Collection<String> collection = map.values();Stream<String> stream4 = collection.stream();//根据map集合的键值对实体对象获取流对象Set<Map.Entry<Integer, String>> map2 = map.entrySet();Stream<Map.Entry<Integer,String>> stream5 = map2.stream();
4.根据数组获取流对象
String[] arr = {"朱志伟","朱航","杨博"};Stream<String> stream6 = Stream.of(arr);
2.2流下面的方法
流就是集合中的数据,对集合中的数据进行操作
| 方法名称 | 方法的作用 | 方法的种类 | 是否支持链式操作 |
|---|---|---|---|
| count | 统计个数 | 终结方法 | 否 |
| forEach | 逐个处理数据 | 终结方法 | 否 |
| filter | 过滤数据 | 函数拼接 | 是 |
| limit | 取前几个 | 函数拼接 | 是 |
| skip | 跳过前几个 | 函数拼接 | 是 |
| map | 映射 | 函数拼接 | 是 |
| concat | 拼接组个 | 函数拼接 | 是 |
方法种类:
终结方法:对流操作的时候,这个方法在链式操作里一定是写在最后的函数拼接:这个函数后面还可以继续写函数
2.2.1count和forEach方法
count:统计流中元素的个数,返回值long。
forEach:遍历数据的
这两个都是终结方法,后面不能在跟方法了
package com.qfedu.test3StreamMethod;import java.util.ArrayList;import java.util.List;//count和forEach方法public class Demo1 {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("张一");list.add("张二三");list.add("朱四五");list.add("张六七");list.add("张八九");//count 统计long count = list.stream().count();System.out.println(count);//5//forEach 遍历 name是遍历数据是的一个临时数据list.stream().forEach((String name)->{System.out.println(name);});}}
2.2.2filter方法
Stream filter(Predicate<? super T> predicate)
Predicate是一个接口,下面只有一个test(T t)返回值为boolean
因此可使用lambda表达式简写
package com.qfedu.test3StreamMethod;import java.util.ArrayList;import java.util.List;import java.util.function.Predicate;import java.util.jar.Attributes.Name;//filterpublic class Demo2 {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("张一");list.add("张二三");list.add("朱四五");list.add("张六七");list.add("张八九");// Predicate<String> predicate = new Predicate<String>() {// @Override// public boolean test(String t) {// // TODO Auto-generated method stub// return false;// }// };//filter 意思是 看数据流返回是一个true,就把它留在流里,false就清除掉list.stream().filter((String Name) -> {return Name.startsWith("朱");}).forEach((String name)->{System.out.println(name);});;}}
2.2.3limit方法
限制,给一个参数,取前几个值。
参数类型 long
package com.qfedu.test3StreamMethod;import java.util.ArrayList;import java.util.List;//limit方法public class Demo3limit {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("张一");list.add("张二三");list.add("朱四五");list.add("张六七");list.add("张八九");list.stream().limit(3).forEach((String name)->{System.out.println(name);;});//取前三个中姓张的list.stream().limit(3).filter((String name)->{return name.startsWith("张");}).forEach((String name)->{System.out.println(name);;});}}张一张二三朱四五张一张二三
2.2.4map方法
用来映射数据的
package com.qfedu.test3StreamMethod;import java.util.ArrayList;import java.util.List;import java.util.function.Function;//map方法 映射数据 valueOf parseInt 都可以将字符串转换为int数据public class Demo4map {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("11");list.add("12");list.add("13");//将上面字符串数据转换成int类型数据// Function<String, Integer> function = new Function<String, Integer>() {// @Override// public Integer apply(String t) {//// return Integer.parseInt(t);// }// };// list.stream().map(function).forEach((Integer a)->{System.out.println(a);;});list.stream().map((String t)->{return Integer.valueOf(t);}).forEach((Integer a)->{System.out.println(a);});}}
2.2.5skip方法
跳过前几个去执行
package com.qfedu.test3StreamMethod;import java.util.ArrayList;import java.util.List;import java.util.jar.Attributes.Name;//跳过前几个值,去取之后的public class Demo5skip {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("张一");list.add("张二三");list.add("朱四五");list.add("张六七");list.add("张八九");list.stream().skip(3).forEach((String Name)->{System.out.println(Name);});}}张六七张八九
2.2.6concat方法
拼接,合并两个流
package com.qfedu.test3StreamMethod;import java.util.ArrayList;import java.util.List;import java.util.stream.Stream;public class Demo6concat {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("张一");list.add("张二三");list.add("朱四五");list.add("张六七");list.add("张八九");List<String> list1 = new ArrayList<String>();list1.add("11");list1.add("12");list1.add("13");//集合合并方法list.addAll(list1);//流合并的方法 concat是stream流的一个静态方法Stream<String> stream = Stream.concat(list.stream(), list1.stream());stream.forEach((String a)->{System.out.println(a);});}}
2.3收集Stream流
toList();将流转换为list集合
toset();将流转换为set集合
package com.qfedu.test4liu_jihe;import java.util.ArrayList;import java.util.List;import java.util.Set;import java.util.stream.Collectors;import java.util.stream.Stream;public class Demo1 {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("张一");list.add("张二三");list.add("朱四五");list.add("张六七");list.add("张八");//过滤出姓张的,且长度为3的Stream<String> stream = list.stream().filter((String name)->{return name.startsWith("张");}).filter((String name)->{return name.length()==3;});List<String> list2 = stream.collect(Collectors.toList());System.out.println(list2);//因为list使用流之后就关闭了// Set<String> set = stream.collect(Collectors.toSet());// System.out.println(set);}}
