java中不同数据类型的转换
1.List 与 Map 互相转换
1.1List转为Map
数据准备:
public static class Person {
private String personNo;
private String name;
// Person 类的构造函数
public Person(String personNo, String name) {
this.personNo = personNo;
this.name = name;
}
// 获取 personNo 属性的方法
public String getPersonNo() {
return personNo;
}
// 获取 name 属性的方法
public String getName() {
return name;
}
// 重写 toString 方法,用于输出 Person 对象信息
@Override
public String toString() {
return "Person{" +
"personNo='" + personNo + '\'' +
", name='" + name + '\'' +
'}';
}
}
// 创建 Person 列表并添加元素
List<Person> personList = new ArrayList<>();
personList.add(new Person("1001", "张三"));
personList.add(new Person("1002", "李四"));
- 使用循环遍历方式
public static Map<String, Person> convertListToMapByLoop(List<Person> list) {
Map<String, Person> map = new HashMap<>();
for (Person person : list) {
map.put(person.getPersonNo(), person);
}
return map;
}
- 使用Java 8 Stream API (流式操作)
// 使用Java 8 Stream API将列表转换为 Map
public static Map<String, Person> convertListToMapByStream(List<Person> personList) {
return personList.stream()
// 使用收集器将元素转换为Map,其中键为 personNo,值为 Person 对象
.collect(Collectors.toMap(Person::getPersonNo, Function.identity()));
}
这行代码的作用是将一个 List 转换为一个 Map<String, Person>,其中键是 Person 对象的某个属性(假设为 personNo),值是对应的 Person 对象本身。让我来详细解释一下:
personList.stream():
这一部分首先将personList转换为一个流(Stream),这样我们就可以对其中的元素进行操作。
.collect(Collectors.toMap(Person::getPersonNo, Function.identity())):
这是一个收集器(Collector),它的作用是将流中的元素收集到一个集合中。在这个例子中,使用Collectors.toMap()方法来将流中的元素映射为一个Map对象。
Person::getPersonNo:
这是一个方法引用,它引用了Person类中的getPersonNo()方法。这种引用方式通常用在函数式接口中,代替了Lambda表达式,用于简化代码和提高可读性。在这里,Person::getPersonNo可以理解为一个函数,用于提取Person对象的personNo属性值。相当于以下Lambda表达式:person -> person.getPersonNo();
Function.identity():
这是一个静态方法,它返回一个函数,该函数会返回其输入参数。在这个场景中,它的作用是作为值的提取器,即保持Person对象本身作为值。
- 使用Apache Commons Collections将列表转换为 Map
public static Map<String, Person> convertListToMapByApacheCommons(List<Person> list) {
return CollectionUtils.toMap(list, Person::getPersonNo, Function.identity());
}
CollectionUtils.toMap 不是 Java 标准库中的方法,而是某个特定的库或框架(比如 Apache Commons Collections)中的自定义方法。它的作用是将一个集合转换为一个映射(Map),可以根据集合中的元素生成键和值。
通常情况下,这种方法的定义类似于:
public static <T, K, V> Map<K, V> toMap(Collection<T> collection, Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends V> valueMapper) {
// 实现代码
}
这个方法接收三个参数:
collection:
要转换为映射的集合。
keyMapper:
一个函数,用于从集合中的每个元素中提取键。
valueMapper:
一个函数,用于从集合中的每个元素中提取值。
使用这个方法,你可以方便地将一个集合中的元素转换为一个以某个属性作为键,以元素本身或者某个属性作为值的映射。
- 使用Google Guava将列表转换为 Map
// 使用Google Guava将列表转换为 Map
public static Map<String, Person> convertListToMapByGuava(List<Person> list) {
return Maps.uniqueIndex(list, Person::getPersonNo);
}
Maps.uniqueIndex(list, Person::getPersonNo) 是 Google Guava 中的方法调用,它的作用是将一个列表转换为一个以 Person 对象的 personNo 属性为键的唯一索引映射(Map)。具体而言,它会将列表中的每个元素作为值,使用 Person::getPersonNo 方法提取的 personNo 属性作为键,构建一个映射。
这个方法的签名通常是这样的:
public static <K, V> ImmutableMap<K, V> uniqueIndex(Iterable<V> values, Function<? super V, K> keyFunction) {
// 实现代码
}
这个方法接收两个参数:
values:
要转换为映射的 Iterable(通常是一个列表)。
keyFunction:
一个函数,用于从每个元素中提取键。
使用这个方法,你可以快速地将一个列表转换为一个以某个属性作为键的映射,并且保证键的唯一性。
1.2 Map转为List
要将一个 Map 转换为一个 List,你可以选择以下几种方式之一,具体取决于你想要在列表中包含什么信息:
- 将 Map 的键转换为列表:
List<KeyType> keys = new ArrayList<>(map.keySet());
- 将 Map 的值转换为列表:
List<ValueType> values = new ArrayList<>(map.values());
- 将 Map 的键值对(Entry)转换为列表:
List<Map.Entry<KeyType, ValueType>> entries = new ArrayList<>(map.entrySet());
这行代码将一个 Map
的键值对(Entry)转换为一个列表。这个操作在实际编程中经常用到,特别是需要对 Map
中的键值对进行遍历或者其他操作时。
其中,entries
是一个 List
类型的变量,它包含了 Map.Entry<KeyType, ValueType>
类型的元素,其中 KeyType
和 ValueType
分别是 Map
的键和值的类型。
这个操作的步骤解析如下:
map.entrySet():
获取 Map 中所有的键值对(Entry)。
new ArrayList<>(...):
将获取到的键值对转换为一个新的 ArrayList,这样就得到了一个包含了 Map.Entry<KeyType, ValueType> 类型元素的列表。
最后将这个列表赋值给了 entries 变量,方便后续对列表中的键值对进行操作。
这种转换方式非常常见,可以让你方便地对 Map 中的键值对进行遍历、筛选或其他操作。
注意:map.entrySet()
map.entrySet() 是 Java 中用于获取 Map 中所有键值对(Entry)的集合的方法。这个集合包含了 Map.Entry<K, V> 类型的元素,其中 K 是键的类型,V 是值的类型。
通过 map.entrySet(),你可以以集合的形式访问 Map 中的所有键值对,并可以对这些键值对进行迭代、过滤、排序等操作。这个方法通常用于:
- 遍历键值对:
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
- 创建新的集合或列表:
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
List<Map.Entry<String, Integer>> entryList = new ArrayList<>(entrySet);
- 应用过滤条件:
List<Map.Entry<String, Integer>> filteredEntries = map.entrySet()
.stream()
.filter(e -> e.getValue() > 1)
.collect(Collectors.toList());
map.entrySet() 返回的 Set 是一个视图,它反映了 Map 的实时状态,因此对这个 Set 进行修改会影响到原始的 Map。这也意味着,如果你在迭代这个集合时修改了 Map,可能会导致并发修改异常(ConcurrentModificationException)。因此,在迭代时要小心处理。
总体来说,map.entrySet() 为操作 Map 中的键值对提供了灵活和强大的方式。
2.List 与 集合 互相转换
2.1 List转为集合
将List转换为Set的目的通常是为了去除重复元素,因为Set集合不允许重复元素的存在。这样可以确保集合中的元素是唯一的。 在某些情况下,我们可能希望在处理数据时只保留唯一的元素,这时将List转换为Set可以帮助我们实现这个目的
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
Set<String> set = new HashSet<>(list);
System.out.println("Set: " + set);
2.2 集合转为List
将Set转换为List的目的可能是为了方便对集合进行操作或者按照特定的顺序处理集合中的元素。虽然Set是无序的集合,但将其转换为List可以确保元素按照特定的顺序排列,方便我们对集合进行遍历、排序或其他操作。另外,有些情况下我们可能需要将Set转换为List以满足特定的接口或方法要求。因此,将Set转换为List可以帮助我们更灵活地处理集合中的元素。
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("cherry");
List<String> list = new ArrayList<>(set);
System.out.println("List: " + list);
3.Integer与 String互相转换
3.1 Integer 转为 String
Integer number = 10;
String strNumber = number.toString();
System.out.println("Integer to String: " + strNumber);
3.2 String 转为 Integer
String strNumber = "20";
Integer number = Integer.parseInt(strNumber);
System.out.println("String to Integer: " + number);