views:

533

answers:

6

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?

+14  A: 

Using ArrayUtils from apache commons-lang

long[] longs = new long[]{1L};
Long[] longObjects = ArrayUtils.toObject(longs);
List<Long> longList = java.util.Arrays.asList(longObjects);
Bozho
+1 Beat me, dammit, it took me way too long to scroll through the `ArrayUtils` javadoc :)
skaffman
:) I opened it in my eclipse (using a decompiler)
Bozho
It's not of much importance, but I dislike copying the array twice. I ended up rolling a utility function to do this directly.
ripper234
+6  A: 

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.

Wayne Young
A: 

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;
}
ripper234
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).
barjak
+1  A: 

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.

Esko
+2  A: 

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.

Paul McKenzie
If you can change the problem, you can use Arrays.asList() directly and don't need that extra ArrayList construction.
Wayne Young
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.
Paul McKenzie
A: 

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();
dfa