Looly 5 年 前
コミット
a6869ae721

+ 1 - 0
CHANGELOG.md

@@ -8,6 +8,7 @@
 ### 新特性
 * 【core   】     修改FastDateParser策略,与JDK保持一致(issue#I1AXIN@Gitee)
 * 【core   】     增加tree(树状结构)(pr#100@Gitee)
+* 【core   】     增加randomEleList(pr#764@Github)
 ### Bug修复
 * 【setting】     修复Props.toBean方法null的问题
 * 【core   】     修复DataUtil.parseLocalDateTime无时间部分报错问题(issue#I1B18H@Gitee)

+ 8 - 9
hutool-core/src/main/java/cn/hutool/core/lang/tree/package-info.java

@@ -1,13 +1,12 @@
 /**
- * 提供通用树生成,特点:
- * <pre>
- *     1、每个字段可自定义
- *     2、支持排序 树深度配置,自定义转换器等
- *     3、支持额外属性扩展
- *     4、贴心 许多属性,特性都有默认值处理
- *     5、使用简单 可一行代码生成树
- *     6、代码简洁轻量无额外依赖
- * <pre/>
+ * 提供通用树生成,特点:<p>
+ * 1、每个字段可自定义<br>
+ * 2、支持排序 树深度配置,自定义转换器等<br>
+ * 3、支持额外属性扩展<br>
+ * 4、贴心 许多属性,特性都有默认值处理<br>
+ * 5、使用简单 可一行代码生成树<br>
+ * 6、代码简洁轻量无额外依赖
+ * </p>
  *
  * @author liangbaikai(https://gitee.com/liangbaikai00/)
  * @since 5.2.1

+ 26 - 3
hutool-core/src/main/java/cn/hutool/core/util/RandomUtil.java

@@ -352,6 +352,28 @@ public class RandomUtil {
 	}
 
 	/**
+	 * 随机获得列表中的一定量的元素,返回List<br>
+	 * 此方法与{@link #randomEles(List, int)} 不同点在于,不会获取重复位置的元素
+	 *
+	 * @param source 列表
+	 * @param count  随机取出的个数
+	 * @param <T>    元素类型
+	 * @return 随机列表
+	 * @since 5.2.1
+	 */
+	public static <T> List<T> randomEleList(List<T> source, int count) {
+		if (count >= source.size()) {
+			return source;
+		}
+		final int[] randomList = ArrayUtil.sub(randomInts(source.size()), 0, count);
+		List<T> result = new ArrayList<>();
+		for (int e : randomList) {
+			result.add(source.get(e));
+		}
+		return result;
+	}
+
+	/**
 	 * 随机获得列表中的一定量的不重复元素,返回Set
 	 *
 	 * @param <T>        元素类型
@@ -374,6 +396,7 @@ public class RandomUtil {
 
 		return result;
 	}
+
 	/**
 	 * 创建指定长度的随机索引
 	 *
@@ -381,11 +404,11 @@ public class RandomUtil {
 	 * @return 随机索引
 	 * @since 5.2.1
 	 */
-	public static int[] randomInts(int length){
+	public static int[] randomInts(int length) {
 		final int[] range = ArrayUtil.range(length);
 		for (int i = 0; i < length; i++) {
-			int random = randomInt(i,length);
-			ArrayUtil.swap(range,i,random);
+			int random = randomInt(i, length);
+			ArrayUtil.swap(range, i, random);
 		}
 		return range;
 	}

+ 44 - 86
hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java

@@ -5,6 +5,8 @@ import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
+import cn.hutool.core.annotation.Alias;
+import lombok.Data;
 import org.junit.Assert;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -31,9 +33,8 @@ import cn.hutool.json.test.bean.report.SuiteReport;
 
 /**
  * JSONObject单元测试
- * 
- * @author Looly
  *
+ * @author Looly
  */
 public class JSONObjectTest {
 
@@ -64,13 +65,13 @@ public class JSONObjectTest {
 				.setDateFormat(DatePattern.NORM_DATE_PATTERN);
 		Assert.assertEquals("{\"dateTime\":\"2019-05-02\"}", json.toString());
 	}
-	
+
 	@Test
 	public void toStringWithDateTest() {
 		JSONObject json = JSONUtil.createObj().put("date", DateUtil.parse("2019-05-08 19:18:21"));
 		assert json != null;
 		Assert.assertEquals("{\"date\":1557314301000}", json.toString());
-		
+
 		json = Objects.requireNonNull(JSONUtil.createObj().put("date", DateUtil.parse("2019-05-08 19:18:21"))).setDateFormat(DatePattern.NORM_DATE_PATTERN);
 		Assert.assertEquals("{\"date\":\"2019-05-08\"}", json.toString());
 	}
@@ -122,7 +123,7 @@ public class JSONObjectTest {
 		JSONObject json = new JSONObject(jsonStr);
 		Assert.assertEquals("体”、“文", json.getStr("test"));
 	}
-	
+
 	@Test
 	@Ignore
 	public void parseStringWithBomTest() {
@@ -224,7 +225,12 @@ public class JSONObjectTest {
 	@SuppressWarnings("ConstantConditions")
 	@Test
 	public void toBeanTest6() {
-		JSONObject json = JSONUtil.createObj().put("targetUrl", "http://test.com").put("success", "true").put("result", JSONUtil.createObj().put("token", "tokenTest").put("userId", "测试用户1"));
+		JSONObject json = JSONUtil.createObj()
+				.put("targetUrl", "http://test.com")
+				.put("success", "true")
+				.put("result", JSONUtil.createObj()
+						.put("token", "tokenTest")
+						.put("userId", "测试用户1"));
 
 		TokenAuthWarp2 bean = json.toBean(TokenAuthWarp2.class);
 		Assert.assertEquals("http://test.com", bean.getTargetUrl());
@@ -356,112 +362,64 @@ public class JSONObjectTest {
 		Assert.assertEquals("yyb\nbbb", jsonObject.getStr("name"));
 		// 转义按照字符串显示
 		Assert.assertEquals("yyb\\nbbb", jsonObject.getStrEscaped("name"));
-		
+
 		String bbb = jsonObject.getStr("bbb", "defaultBBB");
 		Assert.assertEquals("defaultBBB", bbb);
 	}
 
+	@Test
+	public void aliasTest(){
+		final BeanWithAlias beanWithAlias = new BeanWithAlias();
+		beanWithAlias.setValue1("张三");
+		beanWithAlias.setValue2(35);
+
+		final JSONObject jsonObject = JSONUtil.parseObj(beanWithAlias);
+		Assert.assertEquals("张三", jsonObject.getStr("name"));
+		Assert.assertEquals(new Integer(35), jsonObject.getInt("age"));
+
+		JSONObject json = JSONUtil.createObj()
+				.put("name", "张三")
+				.put("age", 35);
+		final BeanWithAlias bean = JSONUtil.toBean(Objects.requireNonNull(json).toString(), BeanWithAlias.class);
+		Assert.assertEquals("张三", bean.getValue1());
+		Assert.assertEquals(new Integer(35), bean.getValue2());
+	}
+
 	public enum TestEnum {
 		TYPE_A, TYPE_B
 	}
 
 	/**
 	 * 测试Bean
-	 * 
-	 * @author Looly
 	 *
+	 * @author Looly
 	 */
+	@Data
 	public static class TestBean {
 		private String strValue;
 		private int intValue;
 		private Double doubleValue;
-		private subBean beanValue;
+		private SubBean beanValue;
 		private List<String> list;
 		private TestEnum testEnum;
-
-		public String getStrValue() {
-			return strValue;
-		}
-
-		public void setStrValue(String strValue) {
-			this.strValue = strValue;
-		}
-
-		public int getIntValue() {
-			return intValue;
-		}
-
-		public void setIntValue(int intValue) {
-			this.intValue = intValue;
-		}
-
-		public Double getDoubleValue() {
-			return doubleValue;
-		}
-
-		public void setDoubleValue(Double doubleValue) {
-			this.doubleValue = doubleValue;
-		}
-
-		public subBean getBeanValue() {
-			return beanValue;
-		}
-
-		public void setBeanValue(subBean beanValue) {
-			this.beanValue = beanValue;
-		}
-
-		public List<String> getList() {
-			return list;
-		}
-
-		public void setList(List<String> list) {
-			this.list = list;
-		}
-
-		public TestEnum getTestEnum() {
-			return testEnum;
-		}
-
-		public void setTestEnum(TestEnum testEnum) {
-			this.testEnum = testEnum;
-		}
-
-		@Override
-		public String toString() {
-			return "TestBean [strValue=" + strValue + ", intValue=" + intValue + ", doubleValue=" + doubleValue + ", beanValue=" + beanValue + ", list=" + list + ", testEnum=" + testEnum + "]";
-		}
 	}
 
 	/**
 	 * 测试子Bean
-	 * 
-	 * @author Looly
 	 *
+	 * @author Looly
 	 */
-	public static class subBean {
+	@Data
+	public static class SubBean {
 		private String value1;
 		private BigDecimal value2;
+	}
 
-		public String getValue1() {
-			return value1;
-		}
-
-		public void setValue1(String value1) {
-			this.value1 = value1;
-		}
-
-		public BigDecimal getValue2() {
-			return value2;
-		}
-
-		public void setValue2(BigDecimal value2) {
-			this.value2 = value2;
-		}
-
-		@Override
-		public String toString() {
-			return "subBean [value1=" + value1 + ", value2=" + value2 + "]";
-		}
+	@Data
+	public static class BeanWithAlias {
+		@Alias("name")
+		private String value1;
+		@Alias("age")
+		private Integer value2;
 	}
 }