29

This sadly doesn't work:

long[] longs = new long[]{1L};
ArrayList<Long> longArray = new ArrayList<Long>(longs);

Is there a nicer way except adding them manually?

1

7 Answers 7

48

Using ArrayUtils from apache commons-lang

long[] longs = new long[]{1L};
Long[] longObjects = ArrayUtils.toObject(longs);
List<Long> longList = java.util.Arrays.asList(longObjects);
Sign up to request clarification or add additional context in comments.

3 Comments

+1 Beat me, dammit, it took me way too long to scroll through the ArrayUtils javadoc :)
:) I opened it in my eclipse (using a decompiler)
It's not of much importance, but I dislike copying the array twice. I ended up rolling a utility function to do this directly.
11

Since others have suggested external libraries, here's the Google Guava libraries way:

long[] longs = {1L, 2L, 3L};
List<Long> longList = com.google.common.primitives.Longs.asList(longs);

Relevant javadoc for Longs.

Comments

8

You can avoid the copy by implementing an AbstractList via a static factory. All changes to the list write through to the array and vice-versa.

Create this method somewhere.

public static List<Long> asList(final long[] l) {
    return new AbstractList<Long>() {
        public Long get(int i) {return l[i];}
        // throws NPE if val == null
        public Long set(int i, Long val) {
            Long oldVal = l[i];
            l[i] = val;
            return oldVal;
        }
        public int size() { return l.length;}
    };
}

Then just invoke this method to create the array. You will need to use the interface List and not the implementation ArrayList in your declaration.

long[] longs = new long[]{1L, 2L, 3L};
List<Long> longArray = asList(longs);

I picked up this technique from the language guide.

Comments

5

Note use of java.lang.Long, not long

final Long[] longs = new Long[]{1L};
final List<Long> longArray = Arrays.asList(longs);

Doesn't add any thirdparty dependencies.

2 Comments

If you can change the problem, you can use Arrays.asList() directly and don't need that extra ArrayList construction.
Surely we all want to change the problem to soemthing easier to solve? So I edited my post to refelect Wayne's cleaner solution. Must remember to read though own posts first.
2

Bozho's answer is good, but I dislike copying the array twice. I ended up rolling my own utility method for this:

public static ArrayList<Long> convertArray(long[] array) {
  ArrayList<Long> result = new ArrayList<Long>(array.length);
  for (long item : array)
    result.add(item);
  return result;
}

2 Comments

Note that in bozho's answer, the array is not copied twice, but only once : Arrays.asList doesn't return a copy, but returns a wrapper around the array (the wrapper implements the List interface). The first copy is needed because Arrays.asList doesn't work with primitive types, hence the first conversion from primitive (long) to object type (Long). See Wayne Young's answer for the direct wrapper solution (no copy at all).
Well, but at least this is the only answer given, which actually returns an ArrayList instead of a List...
2

In JDK 1.8,with Lambda and Stream API,We can do it like this:

long[] longArr = {3L, 4L, 5L, 6L, 7L};
List<Long> longBoxArr = Arrays.stream(longArr).boxed().collect(Collectors.toList());

1 Comment

we need this answer on top.
-1

using Dollar you can do this conversion in only 1 line of code:

long[] longs = new long[]{1L};
List<Long> longList = $(longs).toList();

you can also box them easily:

Long[] arrayOfLongs = $(longs).toArray();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.