javaSE_day17 学习笔记 ——泛型、Stream

1. 泛型

什么是泛型

java泛型设计原则:编译不出错,运行时不会出现ClassCastException

1.1 泛型类

在类上定义的泛型,在方法中也可以使用

在这里插入图片描述

泛型类派生出的子类

  • 子类明确泛型类的类型参数变量
  • 子类不明确泛型类的类型参数变量

eg:
以接口为例:泛型接口
在这里插入图片描述

1.2 泛型接口

interface Demo < T > { }

1.3 泛型方法

1.5 泛型的使用 – 通配符 “?”

? 表示任意数据类型
在这里插入图片描述

设置通配符的上限、下限

  • List<? extends Animal> list
  • List<? super Number> list

在这里插入图片描述

通配符的错误使用

  • class A<?>{}
  • public <?> void t(List<?> list){}
  • List<?> list = new ArrayList<?>();

2. Stream

和io没有任何关系

2.1 流式思想

  • 像生产流水线一样,一个操作接一个操作。
  • 使用流操作集合更高效

2.2 stream的特性

  • stream不存储数据
  • stream不改变源数据
  • stream的延迟执行特性

2.3使用Stream流的步骤

数据源 → 转换成流 → 操作1 → 操作2 →……

2.3.1 数据源(source)

可以是集合、数组等。

2.3.2 获取流对象

  • Stream streamStr = liststr .stream();//把集合变成流
  • Stream streamInt = Stream.of(num);//把数组变成流
    在这里插入图片描述
    Stream只能被使用一次,如果还想使用,必须重新获取流。
    如果不重新获取,会得到异常:stream has already been operated upon or closed
    在这里插入图片描述

2.4 常用方法

  1. filter(): 用于通过设置的条件过滤出元素
    延迟执行,不立刻执行,遇到终结性方法时才执行
  2. map(): 用于映射每个元素到对应的结果
  3. limit(): 用于获取指定数量的流
  4. 跳过前n个stream.skip
  5. 流的连接Stream.concat(stream1,stream2)
  6. 返回数量count 终结性方法
  7. 可以把流转换为 List 类型:collect(Collectors.toList()); 终结性方法
  8. 求和的方法reduce(0, (x, y) -> x + y)
  9. distinct(): 去重
  10. sorted(): 排序
  11. forEach: 遍历 终结性方法

(返回值不是流,则为终结性方法

练习

  1. 有如下整数1,-2,-3,4,-5,使用Stream取元素绝对值并打印。
public static void test1() {
		Stream<Integer> stream = Stream.of(1,-2,-3,4,-5);
		stream.forEach(e->System.out.println(Math.abs(e)));
	}

  
  
  1. 给定一个数字列表,如何返回一个由每个数的平方构成的列表。给定【1,2,3,4,5】, 应该返回【1,4,9,16,25】。
public static void test2() {
		Stream<Integer> stream = Stream.of(1,2,3,4,5);
		stream.map(e->e*e).forEach(e->System.out.println(e));
<span class="token punctuation">}</span>
  1. 有如下7个元素黄药师,冯蘅,郭靖,黄蓉,郭芙,郭襄,郭破虏,使用Stream将以郭字开头的元素存入新集合。
public static void test3() {
		Stream<String> stream = Stream.of("黄药师","冯衡","郭靖","黄蓉","郭芙","郭襄","郭破虏");
		List<String> list = stream.filter(e->e.startsWith("郭")).collect(Collectors.toList());
		System.out.println(list);
	}

 
 
  1. 已知ArrayList集合中有如下元素{陈玄风、梅超风、陆乘风、曲灵风、武眠风、冯默风、罗玉风},使用Stream
    (1)取出前2个元素并在控制台打印输出。
    (2)取出后2个元素并在控制台打印输出。
public static void test4() {
		List<String> liststr = new ArrayList<>();		
		liststr.add("陈玄风");liststr.add("梅超风");liststr.add("陆乘风");
		liststr.add("曲灵风");liststr.add("武眠风");
		liststr.add("冯默风");liststr.add("罗玉风");
		Stream<String> streamStr = liststr.stream();
		streamStr.limit(2).forEach(e->System.out.println(e));
	List<span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">&gt;</span></span> liststr2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token operator">&lt;</span><span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		
	liststr2<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">"陈玄风"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>liststr2<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">"梅超风"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>liststr2<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">"陆乘风"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	liststr2<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">"曲灵风"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>liststr2<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">"武眠风"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	liststr2<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">"冯默风"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>liststr2<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">"罗玉风"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	Stream<span class="token generics function"><span class="token punctuation">&lt;</span>String<span class="token punctuation">&gt;</span></span> streamStr2 <span class="token operator">=</span> liststr2<span class="token punctuation">.</span><span class="token function">stream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	streamStr2<span class="token punctuation">.</span><span class="token function">skip</span><span class="token punctuation">(</span>liststr2<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span>System<span class="token punctuation">.</span>out<span class="token operator">:</span><span class="token operator">:</span>println<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
  1. 用 map 和 reduce 方法数一数流中有多少个Employee
    List emps = Arrays.asList(
    new Employee(102, “李四”, 59),
    new Employee(101, “张三”, 18),
    new Employee(103, “王五”, 28),
    new Employee(104, “赵六”, 8),
    new Employee(105, “田七”, 38)
    );
    在这里插入图片描述
public static void test5() {
		List<Employee> emps = Arrays.asList(
				new Employee(102,"李四",59),new Employee(101,"张三",18),new Employee(103,"王五",28),
				new Employee(104,"赵六",8),new Employee(105,"田七",38)	);
		Stream<Employee> stream = emps.stream();
		System.out.println(stream.map(e->1).reduce(0,(x,y)->x+y));		
	}

 
 
  1. 找出2011年发生的所有交易, 并按交易额排序(从低到高)
    class Transaction {
    private int year; //交易时间
    private int value; //交易额
    方法。。。。
    List transactions =Arrays.asList(
    new Transaction(2011, 300),
    new Transaction(2012, 1000),
    new Transaction(2011, 400),
    new Transaction(2012, 710),
    new Transaction(2011, 200),
    new Transaction(2012, 700),
    new Transaction(2012, 950)
    );

在这里插入图片描述

public static void test6() {
		List<Transaction> transactions = Arrays.asList(
				new Transaction(2011,300),
				new Transaction(2012,1000),
				new Transaction(2011,400),
				new Transaction(2012,710),
				new Transaction(2011,200),
				new Transaction(2012,700),
				new Transaction(2012,950) 
				);
		transactions.stream().filter(e->e.getYear()==2011).sorted((t1,t2)->t1.getValue()-t2.getValue()).forEach(e->System.out.println(e));
	}

 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值