Google Guava «сложнее» в использовании, чем коллекции Apache? [закрыто]

Я подумываю попросить мою команду с разным уровнем квалификации использовать Google Guava. До Guava я бы использовал Коллекции Apache (или его обобщенную версию).

Guava, в отличие от Коллекций Apache, кажется более сильным в некоторых отношениях, но, возможно, менее простым в использовании для менее опытных программистов. Вот одна область, где я думаю, это может служить примером.

Код, который я унаследовал, содержит множество циклов по спискам того, что по сути является картами разнородных значений, зондирование их значений, выполнение проверки на null, а затем выполнение чего-то тривиального:

boolean foo( final List< MapLike > stuff, final String target ) {
  final String upperCaseTarget = target.toUpperCase(0;

  for( MapLike m : stuff ) {
     final Maplike n = (MapLike) m.get( "hard coded string" );
     if( n != null ) {
         final String s = n.get( "another hard code string" );
         if( s != null && s.toUpperCase().equals( upperCaseTarget ) ) {
            return true ;
         }
     }
   return false ;
}

Моей первоначальной мыслью было использовать преобразователи коллекций Apache:

boolean foo( final List< MapLike > stuff, final String target ) {
   Collection< String> sa = (Collection< String >) CollectionUtils.collect( stuff, 
     TransformerUtils.chainedTransformer( new Transformer[] { 
        AppUtils.propertyTransformer("hard coded string"),
        AppUtils.propertyTransformer("another hard coded string"),
        AppUtils.upperCaseTransformer()
         } ) );

    return sa.contains( target.toUpperCase() ) ;        

}

Используя Guava, я мог бы пойти двумя путями:

boolean foo( final List< MapLike > stuff, final String target ) {
   Collection< String > sa = Collections2.transform( stuff,
       Functions.compose( AppUtils.upperCaseFunction(), 
       Functions.compose( AppUtils.propertyFunction("another hard coded string"), 
                          AppUtils.propertyFunction("hard coded string") ) ) );

    return sa.contains( target.toUpperCase() ) ;    
    // or
    // Iterables.contains( sa, target.toUpperCase() );
    // which actually doesn't buy me much

}

По сравнению с коллекциями Apache, Functions.compose (g, f) меняет "интуитивно понятный" порядок: функции применяются справа налево, а не «очевидное» слева направо в TransformerUtils.chainedTransformer.

Более тонкая проблема заключается в том, что, когда Guava возвращает изображение в реальном времени, вызов содержит при просмотре в реальном времени, вероятно, применит (составленную) функцию несколько раз, поэтому я действительно должен сделать следующее:

   return ImmutableSet.copy( sa ).contains( target.toUpperCase() ) ;

Но у меня могут быть нули в моем преобразованном наборе, поэтому я могу ' Я вполне это делаю. Я, конечно, могу слить его в java.util.Collection.

Но это не будет очевидным для моей (менее опытной) команды, и, вероятно, будет упущено из виду в процессе кодирования даже после того, как я объясню это. Я' d надеялся, что, возможно, Iterables.contains () «поступит правильно» и знает какой-нибудь пример магии, позволяющий отличить прокси-сервер живого просмотра от простой старой коллекции, но это не так. Из-за этого Guava, возможно, труднее использовать.

Может быть, я напишу что-то вроде статического метода в моем служебном классе, чтобы справиться с этим?

// List always uses linear search? So no value in copying?
// or perhaps I should copy it into a set?
boolean contains( final List list, final Object target ) {
  return list.contains( target ) ;
}

// Set doesn't use linear search, so copy?
boolean contains( final Set set, final Object target ) {
  //return ImmutableSet.copy( set ).contains( target ) ;
  // whoops, I might have nulls
  return Sets.newHashSet( set ).contains( target ) ;
}

или, возможно, только скопируйте наборы, превышающие определенный размер?

// Set doesn't use linear search, so copy?
boolean contains( final Set set, final Object target ) {
  final Set search = set.size() > 16 : Sets.newHashSet( set ) : set ;
  return search.contains( target ) ;
}

Я полагаю, я спрашиваю, «почему нет« более простого » преобразования в Guava», и я полагаю, что ответ будет «хорошо, просто всегда выгружайте то, что оно возвращает, в новую коллекцию, или напишите свое собственное преобразование, которое делает это ".

Но если мне нужно это сделать, не могли бы другие клиенты библиотек Guava? Возможно, в Гуаве есть способ лучше, чем я Не знаю?

26
задан ColinD 16 October 2010 в 18:56
поделиться