# How to convert this java code: collect(ArrayList::new, ArrayList::add, ArrayList::addAll);

**URL:** <https://discuss.kotlinlang.org/t/how-to-convert-this-java-code-collect-arraylist-new-arraylist-add-arraylist-addall/2856>\
**Category:** Language Design\
**Created:** [May 25, 2017, 7:09am UTC](https://discuss.kotlinlang.org/t/how-to-convert-this-java-code-collect-arraylist-new-arraylist-add-arraylist-addall/2856 "2017-05-25T07:09:45Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![jujucom](https://avatars.discourse-cdn.com/v4/letter/j/838e76/32.png) [@jujucom](https://discuss.kotlinlang.org/u/jujucom)\
**Post date:** [May 25, 2017, 7:09am UTC](https://discuss.kotlinlang.org/t/how-to-convert-this-java-code-collect-arraylist-new-arraylist-add-arraylist-addall/2856/1 "2017-05-25T07:09:46Z")

</div>

Hi folks,  
Do you have any idea to convert the following java code to kotlin? I have trouble in convert this line:  
List list = u.roles.stream().map(role → role.permissions).collect(ArrayList::new, ArrayList::add, ArrayList::addAll);

* * *

import java.util.ArrayList;  
import java.util.List;

public class Mytest {  
public void test() {  
User u = new User();  
List\<String\> list = u.roles.stream().map(role → role.permissions).collect(ArrayList::new, ArrayList::add, ArrayList::addAll);  
list.forEach(System.out::println);  
}

```
public static void main(String[] args) {
    Mytest mytest = new Mytest();
    mytest.test();
}

```

}

class User {  
List\<Role\> roles = new ArrayList\<\>();  
}

## class Role { List\<String\> permissions = new ArrayList\<String\>(); }

updated the code above.

---

<div class="post-metadata">

**Author:** ![waicool20](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/waicool20/32/2487_2.png) [@waicool20](https://discuss.kotlinlang.org/u/waicool20)\
**Post date:** [May 25, 2017, 10:15am UTC](https://discuss.kotlinlang.org/t/how-to-convert-this-java-code-collect-arraylist-new-arraylist-add-arraylist-addall/2856/2 "2017-05-25T10:15:58Z")

</div>

Maybe you want this?

> u.roles.map { it.permissions }.toList()

---

<div class="post-metadata">

**Author:** ![indra](https://avatars.discourse-cdn.com/v4/letter/i/5f9b8f/32.png) [@indra](https://discuss.kotlinlang.org/u/indra)\
**Post date:** [May 25, 2017, 10:23am UTC](https://discuss.kotlinlang.org/t/how-to-convert-this-java-code-collect-arraylist-new-arraylist-add-arraylist-addall/2856/3 "2017-05-25T10:23:57Z")

</div>

I’m a newbie in Kotlin, but is what you’re asking similar to .NET’s “SelectMany”?

 ![](https://us1.discourse-cdn.com/flex019/uploads/kotlinlang/original/2X/e/e189f4a9efa37465018e89a5d3d37920d6aa59a9.PNG)

class User(val name:String, val roles:Sequence)  
class Role(val permissions:Sequence)  
class Permission(val theData:Int)

fun main() {  
val p1 = Permission(1)  
val p2 = Permission(2)  
val p3 = Permission(3)  
val p4 = Permission(4)  
val p5 = Permission(5)  
val p6 = Permission(6)  
val p7 = Permission(7)  
val p8 = Permission(8)

```
val r1 = Role(sequenceOf(p1,p2))
val r2 = Role(sequenceOf(p3,p4))
val r3 = Role(sequenceOf(p5,p6))
val r4 = Role(sequenceOf(p7,p8))

val u1 = User("User1", sequenceOf(r1,r2))
val u2 = User("User2", sequenceOf(r3,r4))

val users = sequenceOf(u1,u2)

users.map { Pair<String, Sequence<Int>>(it.name, it.roles.flatMap { it.permissions.map { it.theData } }) }
        .forEach { println("${it.first} has permission ${it.second.map { it }.toList()}") }

```

}

And the output is like this:  
User1 has permission [1, 2, 3, 4]  
User2 has permission [5, 6, 7, 8]

---

<div class="post-metadata">

**Author:** ![fvasco](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/fvasco/32/1961_2.png) [@fvasco](https://discuss.kotlinlang.org/u/fvasco)\
**Post date:** [May 25, 2017, 10:26am UTC](https://discuss.kotlinlang.org/t/how-to-convert-this-java-code-collect-arraylist-new-arraylist-add-arraylist-addall/2856/4 "2017-05-25T10:26:56Z")

</div>

> [@indra](#):
>
> I’m a newbie in Kotlin

Kotlin exercises is a good starting point 😉

> **[Kotlin Playground: Edit, Run, Share Kotlin Code Online](https://play.kotlinlang.org/)**
>
> Explore Kotlin and practice your coding skills on the Kotlin Playground! Simply type a snippet of code and click Run to try it on the fly.

---

<div class="post-metadata">

**Author:** ![indra](https://avatars.discourse-cdn.com/v4/letter/i/5f9b8f/32.png) [@indra](https://discuss.kotlinlang.org/u/indra)\
**Post date:** [May 25, 2017, 10:28am UTC](https://discuss.kotlinlang.org/t/how-to-convert-this-java-code-collect-arraylist-new-arraylist-add-arraylist-addall/2856/5 "2017-05-25T10:28:06Z")

</div>

I mean, I’m a noob trying to help the guy posting the question 🙂

---

<div class="post-metadata">

**Author:** ![jujucom](https://avatars.discourse-cdn.com/v4/letter/j/838e76/32.png) [@jujucom](https://discuss.kotlinlang.org/u/jujucom)\
**Post date:** [May 26, 2017, 1:19am UTC](https://discuss.kotlinlang.org/t/how-to-convert-this-java-code-collect-arraylist-new-arraylist-add-arraylist-addall/2856/6 "2017-05-26T01:19:57Z")

</div>

No, this isn’t what I want. Because the returned list is a list of array instead of string.

The list in java supposed to be this:  
list: { stringA, stringB,stringC}

but u.roles.map { it.permissions }.toList():  
the list could be {[stringA,stringB],[stringC]}

---

<div class="post-metadata">

**Author:** ![jujucom](https://avatars.discourse-cdn.com/v4/letter/j/838e76/32.png) [@jujucom](https://discuss.kotlinlang.org/u/jujucom)\
**Post date:** [May 26, 2017, 1:22am UTC](https://discuss.kotlinlang.org/t/how-to-convert-this-java-code-collect-arraylist-new-arraylist-add-arraylist-addall/2856/7 "2017-05-26T01:22:04Z")

</div>

I’m not sure whether this is a recommended way to meet my requirement

---

<div class="post-metadata">

**Author:** ![waicool20](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/waicool20/32/2487_2.png) [@waicool20](https://discuss.kotlinlang.org/u/waicool20)\
**Post date:** [May 26, 2017, 2:12am UTC](https://discuss.kotlinlang.org/t/how-to-convert-this-java-code-collect-arraylist-new-arraylist-add-arraylist-addall/2856/8 "2017-05-26T02:12:24Z")

</div>

Use flatMap instead if you want it to be [stringA, stringB, stringC]

> u.rolese.flatMap { it.permissions }.toList()
