import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.junit.Test;
import java.util.*; import java.util.function.Function; import java.util.stream.Collectors;
/ * *
- @description collection (Java 8)
- @Author nice
- @date 2021/5/21 2:07z PM
*/ public class Collect {
@Data
@NoArgsConstructor
@AllArgsConstructor
class Nice{
String name;
NceDel niceDel;
Integer num;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class NceDel{
String name;
Nice nice;
List<Nice> niceList;
}
private static final Map<String,String> map = new HashMap();
private static List<Nice> list = new ArrayList<>();
static{
map.put("nice1","11111");
map.put("nice2","22222");
}
/** 使用 Optional 空对象,然后再次判定*/
@Test
public void test1(){
Nice niceText = new Nice();
niceText.setName("nice");
niceText.setNiceDel(null);
Nice nice = Optional.ofNullable(niceText).filter(s-> s.getName()==null).map(c->c.getNiceDel()).map(d->d.getNice()).orElse(null);
if(nice == null){
System.out.println("空判定");
}
}
/** List 转为 String Map 转为 String */
@Test
public void test2(){
List<String> list1 = Arrays.asList("文学","小说","历史","言情","科幻","悬疑");
List<String> listNull = null;
//方案一:使用String.join()函数,(java)
String string1 = String.join(",",list1);
System.out.println(string1);
//方案二:采用流的方式来写 (java8)
String string2 = list1.stream().collect(Collectors.joining("-"));
System.out.println(string2);
//String string11 = String.join(",",listNull); /** 空指针异常 */
//String string22 = listNull.stream().collect(Collectors.joining("-")); /** 空指针异常 */
System.out.println(getMapToString(map,"#",","));
/** java 8 map 转为list*/
System.out.println(mapToString(map,"#",","));
Object o = null;
System.out.println(o.toString());
}
/** java8 list 转为 map 2种方式 */
@Test
public void test3(){
Nice nice = new Nice();
nice.setName("hahaha");
Nice nice1 = new Nice();
nice1.setName("hahaha");
list.add(nice);
list.add(nice1);
/** 第一种 对象 lambda 表达式 (需要注意:map的key 重复,会抛异常)*/
list.stream().collect(Collectors.toMap(Nice::getName,a -> a));
/** 第一种 另外写法 Function接口中的一个默认方法代替 也会抛key异常*/
list.stream().collect(Collectors.toMap(Nice::getName, Function.identity()));
/** 重复key 解决办法*/
list.stream().collect(Collectors.toMap(Nice::getName, Function.identity(), (key1, key2) -> key2));
/** 重复key 解决办法 重载方法,可以指定一个Map的具体实现 */
list.stream().collect(Collectors.toMap(Nice::getName, Function.identity(), (key1, key2) -> key2, LinkedHashMap::new));
/** 另外一种办法 分组,这样可以避免key 异常 ,不过返回的是List集合*/
Map<String,List<Nice>> mapNice = list.stream().collect(Collectors.groupingBy(Nice::getName));
System.out.println(mapNice.toString());
}
/** java8 map 转为 List 2种方式 */
@Test
public void test4(){
/** 第一种 获取 各自的key和value 组装*/
List<String> resultValue = map.values().stream()
.collect(Collectors.toList());
List<String> resultKey = map.keySet().stream()
.collect(Collectors.toList());
/** 第二种直接获取对应list */
map.entrySet().stream()
.map(x -> x.getValue())
.collect(Collectors.toList()).forEach(System.out::println);
}
/** java8 去重复 */
@Test
public void test5() {
Nice nice = new Nice();
nice.setName("hahaha");
Nice nice1 = new Nice();
nice1.setName("hahaha");
list.add(nice);
list.add(nice1);
/** 使用去重复函数 distinct */
list.parallelStream().distinct().forEach(System.out::println); /** 使用parallelStream,除非微服务,其他不太推荐。线程all in */
/** 根据某个字段 去重复 set */
/**(一个线程安全;一个不安全)1、ArrayList是Array的数据结构,而LinkedList是Link的数据结构;2、随机访问时,ArrayList优于LinkedList;3、新增和删除操作,LinedList比较占优势 */
List<Nice> listNew1 = list.stream() .collect(
Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(user -> user.getName()))), LinkedList::new));
System.out.println(listNew1.toString());
/** 验证是否重复 anyMatch */
boolean b = list.stream().anyMatch(u -> u.getName().equals("Nice"));
System.out.println(b);
}
/** map faltMap filter peck 简单说明和使用 */
@Test
public void test6() {
Nice nice = new Nice();
nice.setName("hahaha");
nice.setNiceDel(new NceDel());
Nice nice1 = new Nice();
nice1.setName("hahaha");
list.add(nice);
list.add(nice1);
/** 过滤 filter */
/** map 一对一进行转换 ; peck 改变对象内容*/
list.stream().filter(s->s.getNiceDel()!=null)/** 过滤 掉NiceDel不等于空的对象 */
.map(s-> s.getNiceDel()) /** 返回 NiceDel 结果;等于 s->{ return s.getNiceDel();} 结果集已经变为List<NiceDel> */
.peek(s->s.setName("111")) /** 无返回处理NiceDel中name的值 */
.collect(Collectors.toList()) /** 返回结果 */
.forEach(System.out::println); /** 不行就打印看看 阿们 */
List<NceDel> listFaltMap = new ArrayList<>();
NceDel nceDel = new NceDel();
nceDel.setNiceList(list);
listFaltMap.add(nceDel);
/** faltMap 单一转换也可以一对多/多对多转换 */
listFaltMap.stream()
.flatMap(s -> s.getNiceList().stream()) /** 多对多转换 */
.collect(Collectors.toList())
.forEach(System.out::println);
}
/** java8 获取最大值与最小值 及 求和 */
public void test7() {
list.stream().map(s->s.getNum()).reduce(Integer::max); /** 最大值 根据 Interger 对象 max */
list.stream().map(s->s.getNum()).reduce(Integer::min); /** 最小值 根据 Interger 对象 max */
list.stream().map(s->s.getNum()).reduce(Integer::sum); /** 求和 */
}
/** java8 排序 */
public void test8() {
/** 根据name 倒序<reversed>,顺序<去掉> */
list.stream().sorted(Comparator.comparing(Nice::getName).reversed()).limit(3).collect(Collectors.toList());
}
/** 非java8 map 转为String <map,"map间隔符","key:value间隔符"> (有序)*/
public static String getMapToString(Map map, String separator, String kvSplice){
Set<String> keySet = map.keySet();
//将set集合转换为数组
String[] keyArray = keySet.toArray(new String[keySet.size()]);
//给数组排序(升序)
Arrays.sort(keyArray);
//因为String拼接效率会很低的,所以转用StringBuilder。String与StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < keyArray.length; i++) {
// 参数值为空,则不参与签名 这个方法trim()是去空格
if (map.get(keyArray[i])!=null) {
sb.append(keyArray[i]).append(kvSplice).append(map.get(keyArray[i]).toString());
}
if(i != keyArray.length-1){
sb.append(separator);
}
}
return sb.toString();
}
/** java8(reduce) map转为String <map,"map间隔符","key:value间隔符"> (无序的)*/
public static String mapToString(Map<?, ?> map, String separator, String kvSplice) {
List<String> result = new ArrayList<>();
map.entrySet().parallelStream().reduce(result, (first, second)->{
first.add(second.getKey() + kvSplice + second.getValue());
return first;
}, (first, second)->{
if (first == second) {
return first;
}
first.addAll(second);
return first;
});
return result.stream().collect(Collectors.joining(separator));
}
Copy the code
}