Java 中 Pair 类的五种替代方案
Pair 是一个容器,用于存储两个对象的元组。Java 并没有真正提供 Pair 类的任何实现。这篇文章将讨论 Java 中 Pair 类的各种替代方案。Pair 通常用于一起跟踪两个对象。它包含两个字段,通常称为firstandsecond,能够存储任何内容。尽管first和second字段之间没有任何有意义的关系,但程序员经常会错过 Java 中的这个功能。在上一篇文章中,我们讨论了如何在 J
Pair 是一个容器,用于存储两个对象的元组。Java 并没有真正提供 Pair 类的任何实现。这篇文章将讨论 Java 中 Pair 类的各种替代方案。
Pair 通常用于一起跟踪两个对象。它包含两个字段,通常称为first
and second
,能够存储任何内容。尽管first
和second
字段之间没有任何有意义的关系,但程序员经常会错过 Java 中的这个功能。
在上一篇文章中,我们讨论了如何在 Java 中实现我们自己的 Pair 类。这篇文章将讨论 Java 中可用的解决方法来填补所需的空白,如下所述:
1. 使用Map.Entry<K,V>
界面
我们可以在 Java 中使用Map.Entry<K,V>接口,类似于std::pair
C++ 中的接口。这是具有代表键值对的有意义名称的绝佳示例。
为了创建表示从指定键到指定值的映射的条目,Java 提供了该Map.Entry
接口的两个具体实现,即AbstractMap.SimpleEntry
和AbstractMap.SimpleImmutableEntry
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import java.util.AbstractMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
class Pair
{
// Return a map entry (key-value pair) from the specified values
public static <T, U> Map.Entry<T, U> of(T first, U second) {
return new AbstractMap.SimpleEntry<>(first, second);
}
}
class Main
{
// Implement Pair class in Java using `Map.Entry`
public static void main(String[] args)
{
Set<Map.Entry<String, Integer>> entries = new HashSet<>();
entries.add(Pair.of("Java", 50));
entries.add(Pair.of("C++", 30));
System.out.println(entries);
// runs in Java 8 and above only
entries.forEach(entry -> {
if (entry.getKey().equals("Java")) {
System.out.println(entry.getValue());
}
});
}
}
|
输出:
[Java=50,C++=30]
50
2. 使用 Java 8 – javafx.util.Pair
终于,经过漫长的等待,Java 8 的package.json 中添加了一个Pair<K,V> 类javafx.util
。类表示键值对,并支持像非常基本的操作getKey()
,getValue()
,hashCode()
,equals(java.lang.Object o)
,和toString()
并具有继承一些方法java.lang.Object
类。嗯,有总比没有好,是吧?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import javafx.util.Pair;
import java.util.ArrayList;
import java.util.List;
class Main
{
// Demonstrate `javafx.util.Pair` class introduced in Java 8 and above
public static void main(String[] args)
{
List<Pair<String, Integer>> entries = new ArrayList<>();
entries.add(new Pair<>("C", 20));
entries.add(new Pair<>("C++", 30));
// print first pair using `getKey()` and `getValue()` method
System.out.println("{" + entries.get(0).getKey() + ", " +
entries.get(0).getValue() + "}");
// print second pair using `getKey()` and `getValue()` method
System.out.println("{" + entries.get(1).getKey() + ", " +
entries.get(1).getValue() + "}");
}
}
|
输出:
{C, 20}
{C++, 30}
3. 使用 Apache Commons Lang
Apache Commons Lang 库还提供了一个Pair<L,R> 实用程序类,其元素是left
和right
。它被定义为抽象并实现了Map.Entry
接口,其中键是left
,值是right
。
它具有Pair.of()
可用于从指定的对象对中获取不可变对的方法。它的子类MutablePair
是可变的,而不可变的ImmutablePair
。但是,存储在ImmutablePair
can中的对象的类型本身可能是可变的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList;
import java.util.List;
class Main
{
// Demonstrate Pair class provided Apache Commons Library in Java
public static void main(String[] args)
{
List<Pair<String, Integer>> entries = new ArrayList<>();
entries.add(new MutablePair<>("C", 20)); // using `MutablePair`
entries.add(new ImmutablePair<>("C++", 30)); // using `ImmutablePair`
entries.add(Pair.of("Java", 50)); // using `Pair.of()`
System.out.println(entries);
// 1. The first pair is mutable
Pair<String, Integer> pair = entries.get(0);
pair.setValue(100); // works fine
// printing pair using `getKey()` and `getValue()` method
System.out.println(pair.getKey() + ", " + pair.getValue());
// 2. The second pair is immutable
pair = entries.get(1);
try {
pair.setValue(100); // runtime error
}
catch (UnsupportedOperationException ex) {
System.out.println("UnsupportedOperationException thrown");
}
// printing pair using `getLeft()` and `getRight()` method
System.out.println(pair.getLeft() + ", " + pair.getRight());
// 3. The third pair is also immutable
pair = entries.get(2);
try {
pair.setValue(100); // runtime error
}
catch (UnsupportedOperationException ex) {
System.out.println("UnsupportedOperationException thrown");
}
System.out.println(pair.getLeft() + ", " + pair.getRight());
}
}
|
输出:
[(C,20), (C++,30), (Java,50)]
C, 100
UnsupportedOperationException 抛出
C++, 30
UnsupportedOperationException 抛出
Java, 50
4. 使用JavaTuples
库
Javatuples是另一个处理元组的著名且简单的 Java 库。它提供了一组Java
从一到十个元素的元组类。为了达到我们的目的,我们可以使用Pair<A,B> 类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
import org.javatuples.Pair;
import java.util.ArrayList;
import java.util.List;
class Main
{
// Demonstrate Pair class provided by `JavaTuples` Library in Java
public static void main(String[] args)
{
List<Pair<String, Integer>> pairs = new ArrayList<>();
pairs.add(Pair.with("Java", 50)); // using `Pair.with()`
pairs.add(new Pair<>("C++", 30)); // using constructors
// print first pair using `getValue0()` and `getValue1()` method
System.out.println("{" + pairs.get(0).getValue0() + ", " +
pairs.get(0).getValue1() + "}");
// print second pair using `getValue0()` and `getValue1()` method
System.out.println("{" + pairs.get(1).getValue0() + ", " +
pairs.get(1).getValue1() + "}");
}
}
|
输出:
{Java,50}
{C++,30}
五、使用Collections.singletonMap()
方法
另一种方法是Collections.singletonMap()
在 Java 中使用类似于Map.Entry<K,V>
前面讨论的 。它返回一个不可变的单例映射,只包含指定的键值对映射,可以将其视为 Pair。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
class Pair
{
// Return an immutable singleton map containing only the specified
// key-value pair mapping
public static <T, U> Map<T, U> of(T first, U second) {
return Collections.singletonMap(first, second);
}
}
class Tuple
{
// Implement Pair class in Java using `Collections.singletonMap()`
public static void main(String[] args)
{
Set<Map<String, Integer>> entries = new HashSet<>();
entries.add(Pair.of("Java", 50));
entries.add(Pair.of("C++", 30));
System.out.println(entries);
}
}
|
输出:
[{Java=50},{C++=30}]
最后,在Android项目中,我们可以使用Android SDK提供的android.util.Pair类。
这就是Pair
Java 类的替代方案。
更多推荐
所有评论(0)