有没有类似BeanUtils.copyProperties实现Map和Bean之间的复制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有类似BeanUtils.copyProperties实现Map和Bean之间的复制相关的知识,希望对你有一定的参考价值。
使用Apache的BeanUtils完全可以,其中
1、Map转Bean:
BeanUtils.populate(bean, map);2、Bean转Map:
new BeanMap(bean); 参考技术A 使用Spring 的BeanWrapper来实现从map 设置到beanT obj = (T) BeanUtils.instantiateClass(type);
BeanWrapper beanWrapper = new BeanWrapperImpl(obj);
beanWrapper.setPropertyValues(m);
反过来,可能需要自己写
BeanWrapper beanWrapper = new BeanWrapperImpl(obj);
PropertyDescriptor[] descriptor = beanWrapper.getPropertyDescriptors();
for (int i = 0; i < descriptor.length; i++)
m.put(descriptor[i].getName,beanWrapper.getPropertyValue(name));
本回答被提问者采纳
Java中有没有类似 Enumerable.Range(x,y) 的东西?
【中文标题】Java中有没有类似 Enumerable.Range(x,y) 的东西?【英文标题】:Is there anything like Enumerable.Range(x,y) in Java? 【发布时间】:2011-02-26 09:09:36 【问题描述】:有没有类似 C#/.NET 的东西
IEnumerable<int> range = Enumerable.Range(0, 100); //.NET
在 Java 中?
【问题讨论】:
【参考方案1】:你可以继承一个 Arraylist 来达到同样的效果:
public class Enumerable extends ArrayList<Integer>
public Enumerable(int min, int max)
for (int i=min; i<=max; i++)
add(i);
然后使用迭代器得到一个从min到max(都包括)的Integers序列
编辑
正如 sepp2k 所提到的 - 上面的解决方案是快速、肮脏和实用的,但有一些严重的撤回(不仅在空间上 O(n),而它应该有 O(1))。为了更认真地模拟 C# 类,我宁愿编写一个自定义的 Enumerable 类,它实现了 Iterable 和一个自定义迭代器(但不是现在;))。
【讨论】:
谢谢安德烈亚斯。所以没有? 不在基本的 Java API 中,afaik,但在众多 apache 公共库之一中可能有一些东西。那是我首先要看的地方。 好的...将您的评论添加到您的答案中,这样我就可以投票并将其标记为答案。 :) 请注意,此解决方案实际上会占用与范围长度成比例的空间(不像 Enumerable.Range,它只存储开始和结束值),这对于大范围可能是不可接受的。 有更多的撤回(我不会在自己的项目中使用该代码)但 OP 没有说明他为什么要使用/模拟 C# 中的 Enumerable 类型。更好的要求,更好的解决方案。【参考方案2】:Java 中没有对此的内置支持,但是自己构建它非常容易。总的来说,Java API 提供了实现此类功能所需的所有位,但不会开箱即用地组合它们。
Java 采用的方法是有无数种组合方式,所以为什么要优先考虑一些组合而不是其他组合。有了正确的构建块集,其他一切都可以轻松构建(这也是 Unix 哲学)。
其他语言 API(例如 C# 和 Python)采取更加谨慎的观点,他们确实选择了一些使事情变得非常简单的东西,但仍然允许更深奥的组合。
在Java IO 库中可以看到Java 方法问题的典型示例。为输出创建文本文件的规范方法是:
BufferedWriter out = new BufferedWriter(new FileWriter("out.txt"));
Java IO 库使用Decorator Pattern,这对于灵活性来说是一个非常好的主意,但您肯定经常需要缓冲文件吗?将其与 Python 中的等价物进行比较,这使得典型用例非常简单:
out = file("out.txt","w")
【讨论】:
是的,你是对的。只是想知道是否有内置的东西。【参考方案3】:已编辑:作为 Java 8,java.util.stream.IntStream.range(int startInclusive, int endExclusive)
可以做到这一点
Java8 之前:
Java 中没有这样的东西,但你可以有这样的东西:
import java.util.Iterator;
public class Range implements Iterable<Integer>
private int min;
private int count;
public Range(int min, int count)
this.min = min;
this.count = count;
public Iterator<Integer> iterator()
return new Iterator<Integer>()
private int cur = min;
private int count = Range.this.count;
public boolean hasNext()
return count != 0;
public Integer next()
count--;
return cur++; // first return the cur, then increase it.
public void remove()
throw new UnsupportedOperationException();
;
例如,您可以通过这种方式使用 Range:
public class TestRange
public static void main(String[] args)
for (int i : new Range(1, 10))
System.out.println(i);
另外,如果你不喜欢直接使用new Range(1, 10)
,你可以使用工厂类:
public final class RangeFactory
public static Iterable<Integer> range(int a, int b)
return new Range(a, b);
这是我们的工厂测试:
public class TestRangeFactory
public static void main(String[] args)
for (int i : RangeFactory.range(1, 10))
System.out.println(i);
希望这些有用:)
【讨论】:
做得很好。找到一个老问题并提供一个更好的答案。 :) 一个小补充,next()
的合约是抛出一个NoSuchElementException
,以防在迭代器没有更多元素的情况下调用该方法,所以我的建议是将if (!hasNext()) throw new NoSuchElementException()
添加为在next()
上要做的第一件事。 :)以上是关于有没有类似BeanUtils.copyProperties实现Map和Bean之间的复制的主要内容,如果未能解决你的问题,请参考以下文章
sql (SSMS) 中的 CONVERT 函数是不是可以替换为 Pyspark.sql 中的类似函数。换句话说,有没有类似的功能?