@ -23,10 +23,14 @@ import cn.hutool.v7.core.map.MapUtil;
import org.junit.jupiter.api.Assertions ;
import org.junit.jupiter.api.Test ;
import java.io.Serial ;
import java.util.* ;
import java.util.stream.Collector ;
import java.util.stream.Collectors ;
import static org.junit.jupiter.api.Assertions.assertEquals ;
import static org.junit.jupiter.api.Assertions.assertThrows ;
/ * *
* CollectionStream测试方法
* /
@ -35,17 +39,17 @@ public class CollStreamUtilTest {
@Test
public void testToIdentityMap ( ) {
Map < Long , Student > map = CollStreamUtil . toIdentityMap ( null , Student : : getStudentId ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
final List < Student > list = new ArrayList < > ( ) ;
map = CollStreamUtil . toIdentityMap ( list , Student : : getStudentId ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
list . add ( new Student ( 1 , 1 , 1 , " 张三 " ) ) ;
list . add ( new Student ( 1 , 1 , 2 , " 李四 " ) ) ;
list . add ( new Student ( 1 , 1 , 3 , " 王五 " ) ) ;
map = CollStreamUtil . toIdentityMap ( list , Student : : getStudentId ) ;
Assertions. assertEquals( map . get ( 1L ) . getName ( ) , " 张三 " ) ;
Assertions. assertEquals( map . get ( 2L ) . getName ( ) , " 李四 " ) ;
Assertions. assertEquals( map . get ( 3L ) . getName ( ) , " 王五 " ) ;
assertEquals( " 张三 " , map . get ( 1L ) . getName ( ) ) ;
assertEquals( " 李四 " , map . get ( 2L ) . getName ( ) ) ;
assertEquals( " 王五 " , map . get ( 3L ) . getName ( ) ) ;
Assertions . assertNull ( map . get ( 4L ) ) ;
/ / 测试value为空时
@ -57,17 +61,17 @@ public class CollStreamUtilTest {
@Test
public void testToMap ( ) {
Map < Long , String > map = CollStreamUtil . toMap ( null , Student : : getStudentId , Student : : getName ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
final List < Student > list = new ArrayList < > ( ) ;
map = CollStreamUtil . toMap ( list , Student : : getStudentId , Student : : getName ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
list . add ( new Student ( 1 , 1 , 1 , " 张三 " ) ) ;
list . add ( new Student ( 1 , 1 , 2 , " 李四 " ) ) ;
list . add ( new Student ( 1 , 1 , 3 , " 王五 " ) ) ;
map = CollStreamUtil . toMap ( list , Student : : getStudentId , Student : : getName ) ;
Assertions. assertEquals( map . get ( 1L ) , " 张三 " ) ;
Assertions. assertEquals( map . get ( 2L ) , " 李四 " ) ;
Assertions. assertEquals( map . get ( 3L ) , " 王五 " ) ;
assertEquals( " 张三 " , map . get ( 1L ) ) ;
assertEquals( " 李四 " , map . get ( 2L ) ) ;
assertEquals( " 王五 " , map . get ( 3L ) ) ;
Assertions . assertNull ( map . get ( 4L ) ) ;
/ / 测试value为空时
@ -79,10 +83,10 @@ public class CollStreamUtilTest {
@Test
public void testGroupByKey ( ) {
Map < Long , List < Student > > map = CollStreamUtil . groupByKey ( null , Student : : getClassId ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
final List < Student > list = new ArrayList < > ( ) ;
map = CollStreamUtil . groupByKey ( list , Student : : getClassId ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
list . add ( new Student ( 1 , 1 , 1 , " 张三 " ) ) ;
list . add ( new Student ( 1 , 2 , 2 , " 李四 " ) ) ;
list . add ( new Student ( 2 , 1 , 1 , " 擎天柱 " ) ) ;
@ -102,16 +106,16 @@ public class CollStreamUtilTest {
final List < Student > class3 = new ArrayList < > ( ) ;
class3 . add ( new Student ( 2 , 3 , 2 , " 霸天虎 " ) ) ;
compare . put ( 3L , class3 ) ;
Assertions. assertEquals( map , compare ) ;
assertEquals( map , compare ) ;
}
@Test
public void testGroupBy2Key ( ) {
Map < Long , Map < Long , List < Student > > > map = CollStreamUtil . groupBy2Key ( null , Student : : getTermId , Student : : getClassId ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
final List < Student > list = new ArrayList < > ( ) ;
map = CollStreamUtil . groupBy2Key ( list , Student : : getTermId , Student : : getClassId ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
list . add ( new Student ( 1 , 1 , 1 , " 张三 " ) ) ;
list . add ( new Student ( 1 , 2 , 2 , " 李四 " ) ) ;
list . add ( new Student ( 1 , 2 , 3 , " 王五 " ) ) ;
@ -141,17 +145,17 @@ public class CollStreamUtilTest {
list22 . add ( new Student ( 2 , 2 , 3 , " 霸天虎 " ) ) ;
map2 . put ( 2L , list22 ) ;
compare . put ( 2L , map2 ) ;
Assertions. assertEquals( map , compare ) ;
assertEquals( map , compare ) ;
}
@Test
public void testGroup2Map ( ) {
Map < Long , Map < Long , Student > > map = CollStreamUtil . group2Map ( null , Student : : getTermId , Student : : getClassId ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
final List < Student > list = new ArrayList < > ( ) ;
map = CollStreamUtil . group2Map ( list , Student : : getTermId , Student : : getClassId ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
list . add ( new Student ( 1 , 1 , 1 , " 张三 " ) ) ;
list . add ( new Student ( 1 , 2 , 1 , " 李四 " ) ) ;
list . add ( new Student ( 2 , 2 , 1 , " 王五 " ) ) ;
@ -164,27 +168,28 @@ public class CollStreamUtilTest {
final Map < Long , Student > map2 = new HashMap < > ( ) ;
map2 . put ( 2L , new Student ( 2 , 2 , 1 , " 王五 " ) ) ;
compare . put ( 2L , map2 ) ;
Assertions. assertEquals( compare , map ) ;
assertEquals( compare , map ) ;
/ / 对null友好
final Map < Long , Map < Long , Student > > termIdClassIdStudentMap = CollStreamUtil . group2Map ( Arrays . asList ( null , new Student ( 2 , 2 , 1 , " 王五 " ) ) , Student : : getTermId , Student : : getClassId ) ;
final Map < Long , Map < Long , Student > > termIdClassIdStudentCompareMap = new HashMap < Long , Map < Long , Student > > ( ) {
@Serial
private static final long serialVersionUID = 1L ;
{
put ( null , MapUtil . empty ( ) ) ;
put ( 2L , MapUtil . of ( 2L , new Student ( 2 , 2 , 1 , " 王五 " ) ) ) ;
} } ;
Assertions. assertEquals( termIdClassIdStudentCompareMap , termIdClassIdStudentMap ) ;
assertEquals( termIdClassIdStudentCompareMap , termIdClassIdStudentMap ) ;
}
@Test
public void testGroupKeyValue ( ) {
Map < Long , List < Long > > map = CollStreamUtil . groupKeyValue ( null , Student : : getTermId , Student : : getClassId ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
final List < Student > list = new ArrayList < > ( ) ;
map = CollStreamUtil . groupKeyValue ( list , Student : : getTermId , Student : : getClassId ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
list . add ( new Student ( 1 , 1 , 1 , " 张三 " ) ) ;
list . add ( new Student ( 1 , 2 , 1 , " 李四 " ) ) ;
list . add ( new Student ( 2 , 2 , 1 , " 王五 " ) ) ;
@ -193,7 +198,7 @@ public class CollStreamUtilTest {
final Map < Long , List < Long > > compare = new HashMap < > ( ) ;
compare . put ( 1L , Arrays . asList ( 1L , 2L ) ) ;
compare . put ( 2L , Collections . singletonList ( 2L ) ) ;
Assertions. assertEquals( compare , map ) ;
assertEquals( compare , map ) ;
}
@Test
@ -202,12 +207,12 @@ public class CollStreamUtilTest {
/ / 参数null测试
Map < Long , List < Student > > map = CollStreamUtil . groupBy ( null , Student : : getTermId , Collectors . toList ( ) ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
/ / 参数空数组测试
final List < Student > list = new ArrayList < > ( ) ;
map = CollStreamUtil . groupBy ( list , Student : : getTermId , Collectors . toList ( ) ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
/ / 放入元素
list . add ( new Student ( 1 , 1 , 1 , " 张三 " ) ) ;
@ -216,11 +221,11 @@ public class CollStreamUtilTest {
/ / 先根据termId分组 , 再通过classId比较 , 找出最大值所属的那个Student , 返回的Optional
final Map < Long , Optional < Student > > longOptionalMap = CollStreamUtil . groupBy ( list , Student : : getTermId , Collectors . maxBy ( Comparator . comparing ( Student : : getClassId ) ) ) ;
/ / noinspection OptionalGetWithoutIsPresent
Assertions. assertEquals( " 李四 " , longOptionalMap . get ( 1L ) . get ( ) . getName ( ) ) ;
assertEquals( " 李四 " , longOptionalMap . get ( 1L ) . get ( ) . getName ( ) ) ;
/ / 先根据termId分组 , 再转换为Map < studentId , name >
final Map < Long , HashMap < Long , String > > groupThen = CollStreamUtil . groupBy ( list , Student : : getTermId , Collector . of ( HashMap : : new , ( m , v ) - > m . put ( v . getStudentId ( ) , v . getName ( ) ) , ( l , r ) - > l ) ) ;
Assertions. assertEquals(
assertEquals(
MapUtil . builder ( )
. put ( 1L , MapUtil . builder ( ) . put ( 1L , " 李四 " ) . build ( ) )
. put ( 2L , MapUtil . builder ( ) . put ( 1L , " 王五 " ) . build ( ) )
@ -235,23 +240,23 @@ public class CollStreamUtilTest {
final Map < Long , List < Student > > termIdStudentsCompareMap = new HashMap < > ( ) ;
termIdStudentsCompareMap . put ( null , Collections . emptyList ( ) ) ;
termIdStudentsCompareMap . put ( 1L , Arrays . asList ( new Student ( 1L , 1 , 1 , " 张三 " ) , new Student ( 1L , 2 , 1 , " 李四 " ) ) ) ;
Assertions. assertEquals( termIdStudentsCompareMap , termIdStudentsMap ) ;
assertEquals( termIdStudentsCompareMap , termIdStudentsMap ) ;
final Map < Long , Long > termIdCountMap = CollStreamUtil . groupBy ( students , Student : : getTermId , Collectors . counting ( ) ) ;
final Map < Long , Long > termIdCountCompareMap = new HashMap < > ( ) ;
termIdCountCompareMap . put ( null , 2L ) ;
termIdCountCompareMap . put ( 1L , 2L ) ;
Assertions. assertEquals( termIdCountCompareMap , termIdCountMap ) ;
assertEquals( termIdCountCompareMap , termIdCountMap ) ;
}
@Test
public void testTranslate2List ( ) {
List < String > list = CollStreamUtil . toList ( null , Student : : getName ) ;
Assertions. assertEquals( list, Collections. EMPTY_LIST ) ;
assertEquals( Collections. EMPTY_LIST , list ) ;
final List < Student > students = new ArrayList < > ( ) ;
list = CollStreamUtil . toList ( students , Student : : getName ) ;
Assertions. assertEquals( list, Collections. EMPTY_LIST ) ;
assertEquals( Collections. EMPTY_LIST , list ) ;
students . add ( new Student ( 1 , 1 , 1 , " 张三 " ) ) ;
students . add ( new Student ( 1 , 2 , 2 , " 李四 " ) ) ;
students . add ( new Student ( 2 , 1 , 1 , " 李四 " ) ) ;
@ -264,16 +269,16 @@ public class CollStreamUtilTest {
compare . add ( " 李四 " ) ;
compare . add ( " 李四 " ) ;
compare . add ( " 霸天虎 " ) ;
Assertions. assertEquals( list , compare ) ;
assertEquals( list , compare ) ;
}
@Test
public void testTranslate2Set ( ) {
Set < String > set = CollStreamUtil . toSet ( null , Student : : getName ) ;
Assertions. assertEquals( set, Collections. EMPTY_SET ) ;
assertEquals( Collections. EMPTY_SET , set ) ;
final List < Student > students = new ArrayList < > ( ) ;
set = CollStreamUtil . toSet ( students , Student : : getName ) ;
Assertions. assertEquals( set, Collections. EMPTY_SET ) ;
assertEquals( Collections. EMPTY_SET , set ) ;
students . add ( new Student ( 1 , 1 , 1 , " 张三 " ) ) ;
students . add ( new Student ( 1 , 2 , 2 , " 李四 " ) ) ;
students . add ( new Student ( 2 , 1 , 1 , " 李四 " ) ) ;
@ -284,7 +289,7 @@ public class CollStreamUtilTest {
compare . add ( " 张三 " ) ;
compare . add ( " 李四 " ) ;
compare . add ( " 霸天虎 " ) ;
Assertions. assertEquals( set , compare ) ;
assertEquals( set , compare ) ;
}
@SuppressWarnings ( " ConstantValue " )
@ -293,19 +298,19 @@ public class CollStreamUtilTest {
Map < Long , Student > map1 = null ;
Map < Long , Student > map2 = Collections . emptyMap ( ) ;
Map < Long , String > map = CollStreamUtil . merge ( map1 , map2 , ( s1 , s2 ) - > s1 . getName ( ) + s2 . getName ( ) ) ;
Assertions. assertEquals( map, Collections. EMPTY_MAP ) ;
assertEquals( Collections. EMPTY_MAP , map ) ;
map1 = new HashMap < > ( ) ;
map1 . put ( 1L , new Student ( 1 , 1 , 1 , " 张三 " ) ) ;
map = CollStreamUtil . merge ( map1 , map2 , this : : merge ) ;
final Map < Long , String > temp = new HashMap < > ( ) ;
temp . put ( 1L , " 张三 " ) ;
Assertions. assertEquals( map , temp ) ;
assertEquals( map , temp ) ;
map2 = new HashMap < > ( ) ;
map2 . put ( 1L , new Student ( 2 , 1 , 1 , " 李四 " ) ) ;
map = CollStreamUtil . merge ( map1 , map2 , this : : merge ) ;
final Map < Long , String > compare = new HashMap < > ( ) ;
compare . put ( 1L , " 张三李四 " ) ;
Assertions. assertEquals( map , compare ) ;
assertEquals( map , compare ) ;
}
private String merge ( final Student student1 , final Student student2 ) {
@ -327,16 +332,16 @@ public class CollStreamUtilTest {
sets . add ( ListUtil . of ( " John " , " Jack " ) ) ;
sets . add ( ListUtil . of ( 'I' , 'J' ) ) ;
final List < List < Object > > collect = CollStreamUtil . cartesianProduct ( sets , 0 ) . collect( Collectors . toList( ) ) ;
Assertions. assertEquals( 8 , collect . size ( ) ) ;
Assertions. assertEquals( " [10, John, I] " , collect . get ( 0 ) . toString ( ) ) ;
Assertions. assertEquals( " [10, John, J] " , collect . get ( 1 ) . toString ( ) ) ;
Assertions. assertEquals( " [10, Jack, I] " , collect . get ( 2 ) . toString ( ) ) ;
Assertions. assertEquals( " [10, Jack, J] " , collect . get ( 3 ) . toString ( ) ) ;
Assertions. assertEquals( " [20, John, I] " , collect . get ( 4 ) . toString ( ) ) ;
Assertions. assertEquals( " [20, John, J] " , collect . get ( 5 ) . toString ( ) ) ;
Assertions. assertEquals( " [20, Jack, I] " , collect . get ( 6 ) . toString ( ) ) ;
Assertions. assertEquals( " [20, Jack, J] " , collect . get ( 7 ) . toString ( ) ) ;
final List < List < Object > > collect = CollStreamUtil . cartesianProduct ( sets , 0 ) . toList( ) ;
assertEquals( 8 , collect . size ( ) ) ;
assertEquals( " [10, John, I] " , collect . get ( 0 ) . toString ( ) ) ;
assertEquals( " [10, John, J] " , collect . get ( 1 ) . toString ( ) ) ;
assertEquals( " [10, Jack, I] " , collect . get ( 2 ) . toString ( ) ) ;
assertEquals( " [10, Jack, J] " , collect . get ( 3 ) . toString ( ) ) ;
assertEquals( " [20, John, I] " , collect . get ( 4 ) . toString ( ) ) ;
assertEquals( " [20, John, J] " , collect . get ( 5 ) . toString ( ) ) ;
assertEquals( " [20, Jack, I] " , collect . get ( 6 ) . toString ( ) ) ;
assertEquals( " [20, Jack, J] " , collect . get ( 7 ) . toString ( ) ) ;
}
/ * *
@ -351,4 +356,38 @@ public class CollStreamUtilTest {
private long studentId ; / / 班级id
private String name ; / / 学生名称
}
@Test
public void testToMap_KeyCollision_SilentlyOverwrite ( ) {
final List < Student > list = new ArrayList < > ( ) ;
list . add ( new Student ( 1 , 101 , 1 , " 张三 " ) ) ;
list . add ( new Student ( 1 , 102 , 1 , " 李四 " ) ) ;
final Map < Long , String > map = CollStreamUtil . toMap ( list , Student : : getStudentId , Student : : getName , false ) ;
assertEquals ( 1 , map . size ( ) ) ;
assertEquals ( " 李四 " , map . get ( 1L ) ) ; / / 确保后面的值覆盖前面的
}
@Test
public void testToMap_NullKeyOrValue ( ) {
final List < Student > list = new ArrayList < > ( ) ;
list . add ( new Student ( 1 , 1 , 1L , " 张三 " ) ) ;
list . add ( null ) ;
list . add ( new Student ( 1 , 2 , 2L , null ) ) ;
assertThrows ( NullPointerException . class , ( ) - > {
CollStreamUtil . toMap ( list , Student : : getStudentId , Student : : getName ) ;
} ) ;
}
@Test
public void testToMap_LargeInputPerformance ( ) {
final List < Student > list = new ArrayList < > ( ) ;
for ( long i = 0 ; i < 10000 ; i + + ) {
list . add ( new Student ( 1 , 1 , i , " 学生 " + i ) ) ;
}
final Map < Long , String > map = CollStreamUtil . toMap ( list , Student : : getStudentId , Student : : getName ) ;
assertEquals ( 10000 , map . size ( ) ) ;
}
}