开发常用API整理

233 阅读5分钟

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<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);
}