JAVA学习(一)java8的stream方法

lambda表达式、集合的stream()方法

一、集合

1.List

List<SysUser> list
-----转Lis<String>
List names = list.stream().map(StatisticsDto::getName).collect(Collectors.toList());
或List names = list.stream().map(e->e.getName()).collect(Collectors.toList());
-----转Set<String>
Set names = list.stream().map(StatisticsDto::getName).collect(Collectors.toSet());
-----转Map
Map<String,Integer> map = list.stream().collect(Collectors.toMap(StatisticsDto::getName, StatisticsDto::getAge));
Map<String,SysUser> map = list.stream().collect(Collectors.toMap(StatisticsDto::getName, item->item));
Map<String,List<SysUser>>> map = list.stream().collect(Collectors.groupingBy(StatisticsDto::getName));

Collectors.toMap时注意:
1、key不能有重复,否则会报错,因为Map的key不能重复
2、value不能为空,否则报空指针,对应处理:
list.stream().collect(HashMap::new,(m, v)->m.put(v.getName(), v.getAddress()), HashMap::putAll);

2.Map

//Map转List
Set mapSet = map.entrySet();
List list= mapSet.stream().map(e -> {
    StatisticsDto statisticsDto = new StatisticsDto();
    statisticsDto.setName(e.getKey());
    statisticsDto.setValue(e.getValue());
    return statisticsDto;
}).collect(Collectors.toList());
或
List stringList = mapSet.stream().map(e -> e.getKey() + " " + e.getValue()).collect(Collectors.toList());

//(s, a) -> a)表示两个输入参数(一个相同的key对应的两个value),返回后一个值
Map classifyIdNameMap = serveTypeDtoList.stream().collect(Collectors.toMap(ServeTypeDto::getServeClassifyId, ServeTypeDto::getServeClassifyName, (s, a) -> a, LinkedHashMap::new));

//分组后顺序不变
Map map = list.stream().collect(Collectors.groupingBy(SzjjHnPilot::getType, LinkedHashMap::new, Collectors.toList()));

//循环
map.forEach((k,v)->{})

3.过滤filter

获取"女孩"所有对象,需要返回接收,并且不会影响原list
List newList = list.stream().filter(item -> item.getName().equals("女孩")).collect(Collectors.toList());

filter得出的结果可能会为空null,则可以这样处理:
List dataList = Optional.ofNullable(list.stream().filter(list.stream().filter(item -> item.getName().equals("女孩")).collect(Collectors.toList())).orElse(new ArrayList<>());
----->现在不会了,如果没有数据会返回空集合,而不是null

4.去重

List newList = list.stream().distinct().collect(Collectors.toList());
List newList = list.stream().map(StatisticsDto::getName).distinct().collect(Collectors.toList());

对不同对象,根据对象的某个属性去重:
普通写法:
Map map = list1.stream().collect(Collectors.toMap(UserEntity::getName, item->item));
Set list1Set = list1.stream().map(UserEntity::getName).collect(Collectors.toSet());
Set list2Set = list2.stream().map(UserEntity::getName).collect(Collectors.toSet());
//list1,移除list2中元素(根据name)
list1Set .removeAll(list2Set);
list1.clear();
for(String str : list1Set){
    list1.add(map.get(str));
}

lambda表达式写法:
Set list2Set = list2.stream().map(item2 ->item2.geName()).collect(Collectors.toSet());
list1 = list1.stream().filter(item-> !list2.stream().map(item2 ->item2.geName()).collect(Collectors.toSet()).contains(item.geName())).collect(Collectors.toList());

5.最大值、最小值

BigDecimal maxValue = list.stream().map(StatisticsDto::getValue).max(Comparator.naturalOrder()).orElse(BigDecimal.ZERO);
BigDecimal maxValue = list.stream().map(StatisticsDto::getValue).min(Comparator.naturalOrder()).orElse(BigDecimal.ZERO);
orElse() 当结果为空时会执行

6.分组

List list
Map map1 = list.stream().collect(Collectors.groupingBy(StatisticsDto::getName));
Map map2 = list.stream().collect(Collectors.groupingBy(e->e.getName()));

分组后顺序不变:
Map classifyIdTypeMap = serveTypeDtoList.stream().collect(Collectors.groupingBy(ServeTypeDto::getServeClassifyId,LinkedHashMap::new, Collectors.toList()));
LinkedHashMap indexIdMap = v.stream().collect(LinkedHashMap::new,(map, item) -> map.put(item.getId(), item),Map::putAll);

7.跳出循环

lambda表达式、集合的stream()方法:
    跳过本次循环 return;
普通for循环:
    跳过本次循环 continue
    跳过所有循环 break;
    跳出多层循环 break loop;
loop:
for(){
    for(){
    	break loop;
    }
}

8.排序

//普通写法:
按照集合的对象元素的某个属性降序
private void listSort(List list){
    Collections.sort(list, new Comparator() {
        @Override
        public int compare(ApiStatisticsDto o1, ApiStatisticsDto o2) {
        	return o2.getOtherCount().compareTo(o1.getOtherCount());
        }
    });
}
升序:


//java8写法:需要接收的
根据TestDto对象的priority字段降序
dtoList = dtoList.sort(Comparator.comparing(TestDto::getPriority).reversed());

升序
dtoList = dtoList.sort(Comparator.comparing(TestDto::getSort));

升序时,属性值为空排后面
dtoList = dtoList.sort(Comparator.comparing(ImportantIndustryInfo::getDataPullGrowth, Comparator.nullsLast(BigDecimal::compareTo)));

按照指定顺序排序
List sortList = Arrays.asList("aaa", "bbb");
List orderTypeList = typeList.stream().sorted(Comparator.comparing(sortList::indexOf)).collect(Collectors.toList());

排序时,值为空会报错,对应处理:
Map industryDataMap = queryList.stream().collect(LinkedHashMap::new, (m, v)->m.put(v.getIndustryName(), v.getData()), LinkedHashMap::putAll); //如上面Collectors.toMap时写法
DataDto dataDto = CollectionUtils.isEmpty(list) ? null : list.stream().sorted(Comparator.comparing(DataDto::getT).reversed()).findFirst().get();

按照多个字段排序,比如标签升序、数据值降序:
Comparator comparator = Comparator.comparing(Industry200ResultDataDto::getRuleSort).thenComparing(Industry200ResultDataDto::getDataValue).reversed();
cityLabelDataList = cityLabelDataList.stream().sorted(comparator).collect(Collectors.toList());

9.求和

BigDecimal industryTotalScore = list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);  //BigDecimal.ZERO:当list中没有元素的时候就默认返回0

10.统计list中对象的重复次数

Map map = list.stream().collect(Collectors.groupingBy(p -> p,Collectors.counting()));
map.forEach((k, v) -> System.out.println(k + ":" + v));

11.Optional处理null的问题

User userById = Optional.ofNullable(xxx).orElse(new User());

二、数组

int[] 转List
//java8写法
int[] arrays = new int[]{1,2};
List list = Arrays.stream(arrays).boxed().collect(Collectors.toList());
  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值