1 多个元素或者数组转集合(字符串举例)
- guava的API , 集合可变长
Lists.newArrayList(String .... value);
- jdk的数组API , 集合不可变长
Arrays.asList(String .... value);
- jdk的数组流操作API, 集合可变长
Arrays.stream(String[] values).collect(Collectors.toList());
- jdk的流操作API, 集合可变长
Stream.of(String[] values).collect(Collectors.toList());
2 String集合转字符串(逗号分隔)
- guava工具类的API
String value = Joiner.on(",").skipNulls().join(userNameList);
//连接器——Joiner,可以用分隔符把字符串序列连接起来。你可以使用
// useForNull(String) 方法用某个字符串来替换null,而不像 skipNulls() 方法那样直接忽略 null。
- commons-lang3工具类的API
String value = StringUtils.join(userNameList, ",");
- jdk stream流的API
String value = userNameList.stream().collect(Collectors.joining(","));
3 集合的stream流操作
lamda表达式:方法(类名/对象引用::方法名) 适用于集合元素可作为入参并且方法只有一个参数的
- findFirst(查找第一个)
cpInfoList.stream().findFirst().get();
cpInfoList.stream().findFirst().orElse(null);
- findAny(查找任意一个) 查找 Stream 中的任意一个元素:
/**
* 集合搜索任意一个
*/
@Test
public void findAny() {
User user = list.stream().findAny().get();
System.out.println(user.getName());
}
//为什么结果和 findFirst 一样?和 findFirst 有什么区别呢?
//findAny 是查找任意一个元素,在串行流中如果数据较少,一般会返回第一个元素,但在并行流中它返回的结果就不确定了,它可能是流中的任何元素。
//findAny 的目的是为了提高并行流操作的性能,但如果需要一个固定的结果,建议使用 findFirst。
- 字符串数组转stream流 最后返回字符串(逗号分隔)
String[] taskIds = strValue.split(",");
String taskIdsStr = Stream.of(taskIds).distinct().collect(Collectors.joining(","));
// 转stream流也可以使用 Arrays.stream(数组)
//distinct()方法去重
- distinct 集合元素去重
cpInfoList.stream().distinct().collect(Collectors.toList());
- filter 过滤 (filter表达式为true的筛选出来)
List<User> resultList = userList.stream()
.filter(a -> a.getJobNumber().equals("201901"))
.collect(Collectors.toList());
- map:获取list对象的某个字段组装成新的list
List<Long> userIdList = userList.stream()
.map(a -> a.getId()).collect(Collectors.toList());
- map逻辑代码块:(代码块可以优化成一个有返回值的方法来写)
List<TripCareSelectorVo> result = listTripResult.getData().stream()
.map(x -> {
String key = x.getSourceCateId();
String name = String.format("%s(%s)", x.getBizCateName(), x.getSourceCateId());
return new TripCareSelectorVo(key, name);
}).collect(Collectors.toList());
- forEach遍历操作:批量设置list对象列表字段为同一个值
addList.stream().forEach(a -> a.setDelFlag("0"));
- 排序:默认为正序(从小到大),reversed()方法可转化为倒序。 举例:按分值从大到小排序
doctorDOS = doctorDOS.stream()
.sorted(Comparator.comparing(DoctorDO::getScore).reversed())
.collect(Collectors.toList());
//排序遇到空值 按下面文档操作:
https://blog.csdn.net/weixin_43563446/article/details/83552305
nullsFirst()和nullsLast()两个方法,两个方法的意思就是,为空的时候,就给放到最前面或者最后面。
- 求和 stream提供了下面几种类型的求和
//Stream::mapToInt
//Stream::mapToDouble
//Stream::mapToLong
public void test() {
List<Person> people = new ArrayList<>();
people.add(new Person("zhangsan",20));
people.add(new Person("lisi", 26));
people.add(new Person("wangwu",35));
int sum = people.stream()
.mapToInt(p -> p.getAge())
.sum();
System.out.println("Total of ages " + sum);
}
//但是没有BigDecimal类型,可以使用下面方法实现
public void test() {
List<Person> list = new ArrayList<>();
list.add(new Person("zhangsan", 20, new BigDecimal(10.5)));
list.add(new Person("lisi", 26, new BigDecimal(22.2)));
list.add(new Person("wangwu", 35, new BigDecimal(15.54)));
BigDecimal amounts = list.stream()
.map(item -> item.getAmount())
.reduce(BigDecimal.ZERO, BigDecimal::add);
amounts = amounts.setScale(1, BigDecimal.ROUND_DOWN);
System.out.println("Total of amounts:" + amounts);
// 或者
BigDecimal sum = list.stream()
.map(Person::getAmount)
.reduce(BigDecimal::add)
.get();
sum = sum.setScale(1, BigDecimal.ROUND_DOWN);
System.out.println("Total of sums: " + sum);
}
- anyMatch(任意匹配) 查找 Stream 中的元素是否存在任意匹配,比如搜索 List 集合中 是否存在 XX 人:
/**
* 集合匹配任意元素
*/
@Test
public void anyMatch() {
System.out.println("是否存在 Jack:" + list.stream().anyMatch(u -> u.getName().contains("Jack")));
System.out.println("是否存在 Jet:" + list.stream().anyMatch(u -> u.getName().contains("Jet")));
}
//Match 返回的结果是 boolean 类型。
- noneMatch(空匹配)
查找 Stream 中的元素是否不存在匹配,比如搜索 List 集合中 是否不存在 XX 人:
/**
* 集合不匹配任意元素
*/
@Test
public void noneMatch() {
System.out.println("是否不存在 Jack:" + list.stream().noneMatch(u -> u.getName().contains("Jack")));
System.out.println("是否不存在 Jet:" + list.stream().noneMatch(u -> u.getName().contains("Jack")));
}
//这个方法的作用就和 anyMatch 相反。
- allMatch(全匹配) 查找 Stream 中的元素是否全部匹配,比如搜索 List 集合中 所有人的年纪是否都大于 XX:
/**
* 集合匹配全部元素
*/
@Test
public void allMatch() {
System.out.println("所有人的年纪都大于3:" + list.stream().allMatch(u -> u.getAge() > 2));
System.out.println("所有人的年纪都大于30:" + list.stream().allMatch(u -> u.getAge() > 30));
}
-
将List集合转成Map集合 看下面文档: blog.csdn.net/qq_31332819…
-
peek 做一些业务逻辑:修改集合元素的数据
List<ArtooCallOutFailDO> callOutFailDOList = callOutFails.stream()
.map(f -> convertCallOutTaskFailDO(f))
.peek(a -> {
a.setGmtCreate(new Date());
a.setGmtModified(a.getGmtCreate());
}).collect(Collectors.toList());
4 String字符串操作
- Long类型或者其他类型转为字符串类型
String value = String.valueOf(564646L);
- 字符串的模板格式化操作 字符串拼接
String value = String.format("%s(%s)",“张三”, “女”);
//value = 张三(女)
double distance = 8.23788293;
String.format("%.2f",distance);//取小数点后两位
- jdk原生API 支持字符串拼接
MessageFormat.format("https://market.m.taobao.com/app/trip/h5/{0}/yeidi/{1}", 45, 87);
//返回值为:https://market.m.taobao.com/app/trip/h5/45/yeidi/87
- java数字格式化输出时前面补0
/**
* 数字转字符串前面自动补0的实现。
*/
public class TestStringFormat {
public static void main(String[] args) {
int youNumber = 1;
// 0 代表前面补充0
// 4 代表长度为4
// d 代表参数为正数型
String str = String.format("%04d", youNumber);
System.out.println(str); // 0001
}
}
5 json操作
- 将java对象转换为JSONObject对象
//com.alibaba.fastjson API
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(voucherDTO));
jsonObject.getString(属性名key);
- 将json字符串转为json数组
JSONArray jsonArray = JSON.parseArray(String text);
JSONArray jsonArray = JSONArray.parseArray(String text);
6 Stream流操作 代替for循环遍历
//IntStream,LongStream
List<String> userNameList = new ArrayList();
IntStream.range(0, userNameList.size())
.forEach(i -> {
String userName = userNameList.get(i);
//其他操作
});
7 Optional--jdk的对象操作API
String bucket = Optional.ofNullable(sceneId)
.filter(s -> !"xspace".equals(s))
.map(s -> Long.valueOf(s))
.map(s -> sceneLoader.queryById(s))
.map(s -> s.getBucket())
.orElse("restore-media");
//可以对操作对象进行过滤,转换,map操作时也可以进行判空
//API可以取代三目运算符
** 也可以对集合进行操作 但是相比于Optional,stream流操作集合时 支持的功能更多。
8 guava工具类创建map,set,list
List list = Lists.newArrayList();
##配置数据做分组 Guava工具类
Map<String, Set<String>> buIdAndRoleIdsMap = Maps.newLinkedHashMap();
for (String rolePermissionId : CpManageSwitch.rolePermissionIds) {
String[] buIdAndRoleId = rolePermissionId.split("_");
String buId = buIdAndRoleId[0];
String roleId = buIdAndRoleId[1];
Set<String> roleIds = buIdAndRoleIdsMap.getOrDefault(buId, Sets.newLinkedHashSet());
roleIds.add(roleId);
buIdAndRoleIdsMap.put(buId, roleIds);
}