当请求可能在该向量中的值时,返回值,其中值是向量

时间:2016-01-08 07:19:11

标签: clojure

鉴于以下数据结构,我想要求" services-list" (一个组件)并接收" entity-list" (一种风格)。

Set padding to parent view of card view to 3dp.

Like,
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   android:padding="8dp"
    android:background="@android:color/white">

 <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:elevation="8dp"
            android:id="@+id/card1">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#FFFFFF"
                android:orientation="horizontal">

                <ImageView
                    android:id="@+id/imgCard"
                    android:layout_width="50dp"
                    android:layout_height="50dp"
                    android:layout_margin="10dp"
                    android:src="@drawable/add_contact" />

                <TextView
                    android:id="@+id/tvColor"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:text="Card View" />
            </LinearLayout>
        </android.support.v7.widget.CardView>
</RelativeLayout>

我的解决方案并不那么优雅:

(def style->components {"entity-list" ["services-list" "employee-list" "clients-list"]})

有更好的方法吗?也许我的问题始于我构建数据的方式。

2 个答案:

答案 0 :(得分:3)

你可以通过这种方式让它更短更隐蔽:

(defn get-style-name [comp-name]
  (ffirst (filter (fn [[_ v]]
                    (some #{comp-name} v))
                  component->style)))
  1. 有一个功能ffirst,其功能与(first (first %))完全相同

  2. 使用过滤函数签名中的解构,您可以检索映射条目的值,避免不必要的let

  3. 而不是some中的此功能:#(= % comp-name)使用集合是非常常见的:#{comp-name}

  4. 然后您可以使用some代替filter,因为它返回函数返回的第一个逻辑true值,因此您可以删除ffirst

    (defn get-style-name [comp-name]
      (some (fn [[k v]]
              (when (some #{comp-name} v) k))
            component->style))
    

    另外,如果您将数据结构更改为使用set而不是vector,则可以使其更短:

    (def component->style {"entity-list" #{"services-list" 
                                           "employee-list" 
                                           "clients-list"}})
    
    (defn get-style-name [comp-name]
      (some (fn [[k v]] (when (v comp-name) k))
            component->style))
    

答案 1 :(得分:1)

只是为了添加另一种选择,嵌套序列操作通常可以替换为for

(defn get-style-name
  [comp-name]
  (first
    (for [[style-name comp-names] style->components
          comp-name'              comp-names
          :when (= comp-name comp-name')]
      style-name)))

不过,我更喜欢一种解决方案,其中预先计算组件名称到样式名称的映射,例如

(def get-style-name
  (->> (for [[style-name comp-names] style->components
             comp-name               comp-names]
         [comp-name style-name])
       (into {})))

这样,您就可以避免在每次查找时遍历style->components地图。