Skip to content

Commit c9ad21a

Browse files
committed
Merge pull request #18 from thomasnield/master
GuavaTransformers
2 parents 4e1568c + ef7adcf commit c9ad21a

File tree

2 files changed

+197
-0
lines changed

2 files changed

+197
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package rx.transformer;
2+
3+
import com.google.common.collect.ImmutableList;
4+
import com.google.common.collect.ImmutableListMultimap;
5+
import com.google.common.collect.ImmutableMap;
6+
import com.google.common.collect.ImmutableSet;
7+
import rx.Observable;
8+
import rx.functions.Action2;
9+
import rx.functions.Func0;
10+
import rx.functions.Func1;
11+
12+
/**
13+
* Copyright 2014 Netflix, Inc.
14+
*
15+
* Licensed under the Apache License, Version 2.0 (the "License");
16+
* you may not use this file except in compliance with the License.
17+
* You may obtain a copy of the License at
18+
*
19+
* http://www.apache.org/licenses/LICENSE-2.0
20+
*
21+
* Unless required by applicable law or agreed to in writing, software
22+
* distributed under the License is distributed on an "AS IS" BASIS,
23+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
24+
* See the License for the specific language governing permissions and
25+
* limitations under the License.
26+
*/
27+
28+
/**
29+
* A class of static factory methods to transform an Observable into an Observable of Guauva collections
30+
*/
31+
public final class GuavaTransformers {
32+
33+
private GuavaTransformers() {}
34+
35+
/**
36+
* Returns a Transformer<T,ImmutableList<T>&gt that maps an Observable<T> to an Observable<ImmutableList<T>>
37+
*/
38+
public static <T> Observable.Transformer<T,ImmutableList<T>> toImmutableList() {
39+
return new Observable.Transformer<T, ImmutableList<T>>() {
40+
@Override
41+
public Observable<ImmutableList<T>> call(Observable<T> source) {
42+
return source.collect(new Func0<ImmutableList.Builder<T>>() {
43+
@Override
44+
public ImmutableList.Builder<T> call() {
45+
return ImmutableList.builder();
46+
}
47+
}, new Action2<ImmutableList.Builder<T>, T>() {
48+
@Override
49+
public void call(ImmutableList.Builder<T> builder, T t) {
50+
builder.add(t);
51+
}
52+
})
53+
.map(new Func1<ImmutableList.Builder<T>, ImmutableList<T>>() {
54+
@Override
55+
public ImmutableList<T> call(ImmutableList.Builder<T> builder) {
56+
return builder.build();
57+
}
58+
});
59+
}
60+
};
61+
}
62+
/**
63+
* Returns a Transformer&lt;T,ImmutableSet&lt;T&gt;&gt that maps an Observable&lt;T&gt; to an Observable&lt;ImmutableSet&lt;T&gt;&gt;
64+
*/
65+
public static <T> Observable.Transformer<T,ImmutableSet<T>> toImmutableSet() {
66+
return new Observable.Transformer<T, ImmutableSet<T>>() {
67+
@Override
68+
public Observable<ImmutableSet<T>> call(Observable<T> source) {
69+
return source.collect(new Func0<ImmutableSet.Builder<T>>() {
70+
@Override
71+
public ImmutableSet.Builder<T> call() {
72+
return ImmutableSet.builder();
73+
}
74+
}, new Action2<ImmutableSet.Builder<T>, T>() {
75+
@Override
76+
public void call(ImmutableSet.Builder<T> builder, T t) {
77+
builder.add(t);
78+
}
79+
})
80+
.map(new Func1<ImmutableSet.Builder<T>, ImmutableSet<T>>() {
81+
@Override
82+
public ImmutableSet<T> call(ImmutableSet.Builder<T> builder) {
83+
return builder.build();
84+
}
85+
});
86+
}
87+
};
88+
}
89+
/**
90+
* Returns a Transformer&lt;T,ImmutableMap&lt;K,V&gt;&gt that maps an Observable&lt;T&gt; to an Observable&lt;ImmutableMap&lt;K,V&gt;&gt><br><br>
91+
* with a given Func1&lt;T,K&gt; keyMapper and Func1&lt;T,V&gt; valueMapper
92+
*/
93+
public static <T,K,V> Observable.Transformer<T,ImmutableMap<K,V>> toImmutableMap(final Func1<T,K> keyMapper, final Func1<T,V> valueMapper) {
94+
return new Observable.Transformer<T,ImmutableMap<K,V>>() {
95+
@Override
96+
public Observable<ImmutableMap<K, V>> call(Observable<T> observable) {
97+
return observable.collect(new Func0<ImmutableMap.Builder<K, V>>() {
98+
@Override
99+
public ImmutableMap.Builder<K, V> call() {
100+
return ImmutableMap.builder();
101+
}
102+
}, new Action2<ImmutableMap.Builder<K, V>, T>() {
103+
@Override
104+
public void call(ImmutableMap.Builder<K, V> builder, T t) {
105+
builder.put(keyMapper.call(t), valueMapper.call(t));
106+
}
107+
})
108+
.map(new Func1<ImmutableMap.Builder<K, V>, ImmutableMap<K, V>>() {
109+
@Override
110+
public ImmutableMap<K, V> call(ImmutableMap.Builder<K, V> builder) {
111+
return builder.build();
112+
}
113+
});
114+
}
115+
};
116+
}
117+
118+
/**
119+
* Returns a Transformer&lt;T,ImmutableListMultimap&lt;K,V&gt;&gt that maps an Observable&lt;T&gt; to an Observable&lt;ImmutableListMultimap&lt;K,V&gt;&gt><br><br>
120+
* with a given Func1&lt;T,K&gt; keyMapper and Func1&lt;T,V&gt; valueMapper
121+
*/
122+
public static <T,K,V> Observable.Transformer<T,ImmutableListMultimap<K,V>> toImmutableListMultimap(final Func1<T,K> keyMapper, final Func1<T,V> valueMapper) {
123+
return new Observable.Transformer<T,ImmutableListMultimap<K,V>>() {
124+
@Override
125+
public Observable<ImmutableListMultimap<K, V>> call(Observable<T> observable) {
126+
return observable.collect(new Func0<ImmutableListMultimap.Builder<K, V>>() {
127+
@Override
128+
public ImmutableListMultimap.Builder<K, V> call() {
129+
return ImmutableListMultimap.builder();
130+
}
131+
}, new Action2<ImmutableListMultimap.Builder<K, V>, T>() {
132+
@Override
133+
public void call(ImmutableListMultimap.Builder<K, V> builder, T t) {
134+
builder.put(keyMapper.call(t), valueMapper.call(t));
135+
}
136+
})
137+
.map(new Func1<ImmutableListMultimap.Builder<K, V>, ImmutableListMultimap<K, V>>() {
138+
@Override
139+
public ImmutableListMultimap<K, V> call(ImmutableListMultimap.Builder<K, V> builder) {
140+
return builder.build();
141+
}
142+
});
143+
}
144+
};
145+
}
146+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package rx.transformer;
2+
3+
import static org.junit.Assert.*;
4+
5+
import com.google.common.collect.ImmutableList;
6+
import com.google.common.collect.ImmutableListMultimap;
7+
import com.google.common.collect.ImmutableMap;
8+
import com.google.common.collect.ImmutableSet;
9+
10+
import org.junit.Test;
11+
12+
import rx.Observable;
13+
import rx.functions.Func1;
14+
15+
public class GuavaTransformersTest {
16+
@Test
17+
public void testList() {
18+
assertEquals(ImmutableList.builder().add(1).add(3).add(2).add(3).build(), Observable.just(1, 3, 2, 3).compose(GuavaTransformers.toImmutableList()).toBlocking().last());
19+
}
20+
21+
@Test
22+
public void testSet() {
23+
assertEquals(ImmutableSet.builder().add(1).add(3).add(2).add(3).build(), Observable.just(1, 3, 2, 3).compose(GuavaTransformers.toImmutableSet()).toBlocking().last());
24+
}
25+
26+
Func1<String, String> keyMapper = new Func1<String, String>() {
27+
@Override
28+
public String call(String t) {
29+
return t.split(":")[0];
30+
}
31+
};
32+
33+
Func1<String, String> valueMapper = new Func1<String, String>() {
34+
@Override
35+
public String call(String t) {
36+
return t.split(":")[1];
37+
}
38+
};
39+
40+
@Test
41+
public void testMap() {
42+
assertEquals(ImmutableMap.builder().put("a", "1").put("b", "2").put("c", "3").build(), Observable.just("a:1", "b:2", "c:3").compose(GuavaTransformers.toImmutableMap(keyMapper, valueMapper))
43+
.toBlocking().last());
44+
}
45+
46+
@Test
47+
public void testListMap() {
48+
assertEquals(ImmutableListMultimap.builder().put("a", "1").putAll("b", "2", "4").put("c", "3").build(), Observable.just("a:1", "b:2", "c:3", "b:4").compose(
49+
GuavaTransformers.toImmutableListMultimap(keyMapper, valueMapper)).toBlocking().last());
50+
}
51+
}

0 commit comments

Comments
 (0)